Questions tagged «directx»

DirectX是Microsoft提供的一组多媒体API,主要针对游戏开发人员。DirectX集合中的流行API包括Direct3D,XInput和XAudio。

4
使用全屏四边形对渲染目标进行完美像素渲染
将一堆值渲染到rendertarget时遇到一些麻烦。这些值永远不会在我想要它们的确切范围内。基本上,我使用全屏四边形和像素着色器渲染到我的rendertarget纹理,然后打算将纹理坐标用作着色器中某些计算的基础。四边形的纹理坐标范围从左上角的(0,0)到右下角的(1,1)...问题是,插值后,这些值没有像这样到达像素着色器。 一个示例: 我渲染为4x4纹理,在这种情况下,着色器仅在红色和绿色通道中输出纹理坐标(u,v): return float4(texCoord.rg, 0, 1); 我要摆脱的是一种纹理,其中左上角的像素是RGB(0,0,0),因此是黑色,右上角的像素是RGB(255,0,0),因此是明亮的红色,左下角的像素为RGB(0,255,0)-亮绿色。 但是,相反,我在这里得到此: (直四边形渲染,无校正) 左上方的像素是黑色,但在其他角落我只能得到相对深红色和深绿色。它们的RGB值为(191,0,0)和(0,191,0)。我强烈怀疑它与四边形的采样位置有关:左上像素正确地对四边形的左上角进行采样,并获得(0,0)作为UV坐标,但其他角点像素未从中采样四边形的其他角。我已经在左图中说明了这一点,蓝色框代表四边形,白色点代表上采样坐标。 现在,我知道在Direct3D9中渲染屏幕对齐的四边形时应将半像素偏移应用于坐标。让我们看看我从中得到什么样的结果: (以DX9的半像素偏移量渲染的四进制) 红色和绿色变亮,但仍然不正确:223是我在红色或绿色通道上获得的最大值。但是现在,我什至没有纯黑色,而是带有RGB(32,32,0)的深黄灰色! 我真正需要的是这种渲染: (目标渲染,减小的四边形尺寸) 与第一个图形相比,看起来我必须将四边形的右边界和底边界恰好向左移动一个像素。然后,像素的右列和底行都应正确地从四边形的边界正确获取UV坐标: VertexPositionTexture[] quad = new VertexPositionTexture[] { new VertexPositionTexture(new Vector3(-1.0f, 1.0f, 1f), new Vector2(0,0)), new VertexPositionTexture(new Vector3(1.0f - pixelSize.X, 1.0f, 1f), new Vector2(1,0)), new VertexPositionTexture(new Vector3(-1.0f, -1.0f + pixelSize.Y, 1f), new Vector2(0,1)), new VertexPositionTexture(new …

3
为什么不能将布尔值打包并对齐到D3D常量缓冲区中?
好吧,我很难将布尔值打包并对齐到hlsl常量缓冲区中,我不确定为什么。 这是hlsl中的缓冲区 cbuffer MaterialBuffer : register(b1) { float3 materialDiffuseAlbedo; float materialSpecularExponent; float3 materialSpecularAlbedo; bool isTextured; }; 这是用c ++编写的 struct GeometryBufferPass_MaterialBuffer { XMFLOAT3 diffuse; float specularExponent; XMFLOAT3 specular; bool isTextured; }; 我试图以各种方式移动布尔并填充结构,但是没有运气。正确的方法是什么?

4
在基于二维图块的游戏中,滚动的好方法是什么?
我将D3DXSPRITE包装器与Direct3D配合使用,将图块绘制到屏幕上。我有一个图块类,其中包含诸如碰撞和图块类型的成员,然后我有一个图块数组,例如 平铺网格[256] [256]; 哪种方法更好? -将播放器绘制在屏幕中央,并在地图绘制位置偏移。 -使用以下摄像机移动播放器。 我使用的是第一种方法,但是当您到达地图的左上边缘以及其他玩家/敌人同时在地图上移动时,它变得非常复杂 如果我让摄像机跟随播放器,即使屏幕上只能容纳几个网格块,我是否也必须为每个单个网格块调用spriteBatch-> Draw(...)?
9 c++  directx  directx9 


3
Direct3D纹理采样非常慢
因此,我使用Direct3D 9编写了一个小型游戏,并且针对地形使用了多重纹理。我要做的是对3个纹理和一个混合贴图进行采样,并基于混合贴图的颜色通道从这三个纹理中获取整体颜色。无论如何,当我对1个以上的纹理进行采样时,我的帧速率会大幅下降,我将从120+ fps降至不到50 fps。 这是造成速度下降的HLSL代码: float3 ground = tex2D(GroundTex, multiTex).rgb; float3 stone = tex2D(StoneTex, multiTex).rgb; float3 grass = tex2D(GrassTex, multiTex).rgb; float3 blend = tex2D(BlendMapTex, blendMap).rgb; 我做错了吗?如果任何人有任何有关纹理采样的信息或技巧,那都很好。 谢谢。

6
多通效果的好例子吗?
在XNA(和一般AFAIK中为Direct3D)中,您可能没有创建单独的顶点和片段着色器,而是将许多相关的着色器捆绑到“效果”中。当您开始使用效果时,请选择“技术”(或遍历所有技术),然后每个“技术”都有许多“通过”。您遍历每遍,选择相关的顶点和片段着色器,然后绘制几何图形。 我很好奇的是,您需要多次通过吗?我知道在3d的早期,您只有一个纹理单位,然后只有2个纹理单位,但是如果您还想进行环境映射,那么通常仍然不够用。但是在现代设备上,即使在移动类中,您也可以在单个着色器中采样8个或更多纹理,并执行所需的任意多个光照计算。 这里经验丰富的人能否提供一些仍需要多遍渲染的实际示例,或者这只是XNA / Direct3d的过度设计?
9 xna  directx  shaders 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.