为什么我的几何着色器生成的广告牌没有显示给出以下代码?

我的程序是一个雨滴粒子系统。 在处理了一系列降雨粒子的位置之后,我将它们传递给几何着色器,以便为每个位置生成一个广告牌

如果我用一个简单的方法来生成广告牌(这是一个矩形,而不是一个广告牌),它运行良好,我可以在渲染目标中看到它们。 这个简单的方法certificate了几何着色器的input位置是正确的。 下面的HLSL来源实现这个简单的广告牌。

[maxvertexcount(4)] void GSMAIN( point GS_INPUT input[1], inout TriangleStream<PS_INPUT> SpriteStream ) { //Transform to view space float4 viewposition = mul(float4(input[0].position, 1.0f), WorldViewMatrix); // Emit two new triangles for (int i = 0; i < 4; i++) { // Transform to clip space //g_positions is an array of four deltal vectors in the form: (-scale, +scale, 0, 0).. output.position = mul(viewposition + g_positions[i], ProjMatrix); output.texcoords = g_texcoords[i]; output.color = color; SpriteStream.Append(output); } SpriteStream.RestartStrip(); } 

但是,如果我改变创造一个真正的广告牌,它什么也没有显示。 我的方法是基于降雨的速度vector。 实现如下:

 [maxvertexcount(4)] void GSMAIN( point GS_INPUT input[1], inout TriangleStream<PS_INPUT> SpriteStream ) { PS_INPUT output; //Velocity of raindrop = Rate + original velocity //The billboard will stays along this vector float3 velocityVector = input[0].speed.xyz/FrameRate + TotalVelocity; //ViewPosition: the position of camera GenRainSpriteVertices(input[0].position, velocityVector, ViewPosition, pos); for(int i = 0; i < 4; i++) { output.position = mul(float4(pos[i], 1.0f), WorldViewProjMatrix); output.texcoords = g_texcoords[0]; output.color = color; SpriteStream.Append(output); } } /////////////////////////////////////////////////// //The function generating billboard from //1. Point Position //2. Eye Position //3. Velocity vector /////////////////////////////////////////////////// void GenRainSpriteVertices(float3 worldPos, float3 velVec, float3 eyePos, out float3 outPos[4]) { float height = g_SpriteSize / 2.0; float width = height / 10.0; velVec = normalize(velVec); float3 eyeVec = eyePos - worldPos; float3 eyeOnVelVecPlane = eyePos - ((dot(eyeVec, velVec)) * velVec); float3 projectedEyeVec = eyeOnVelVecPlane - worldPos; float3 sideVec = normalize(cross(projectedEyeVec, velVec)); outPos[0] = worldPos - (sideVec * 0.5*width); outPos[1] = outPos[0] + (sideVec * width); outPos[2] = outPos[0] + (velVec * height); outPos[3] = outPos[2] + (sideVec * width); } 

我尝试在VS2012中使用Nsight和graphics诊断进行debugging,所有这些都显示几何着色器生成了正确的顶点。 以下图片来自Visual Studio和Nsight,它们在几何着色器完成其作业后呈现结果。 在这里输入图像说明

而下一个结果是来自Nsight: 在这里输入图像说明

由于某些原因,几何着色器中生成的顶点在像素着色器中被丢弃。 为什么会这样?

Solutions Collecting From Web of "为什么我的几何着色器生成的广告牌没有显示给出以下代码?"

事实上,当你使用“简单的方法”来呈现某些东西,并且在Nsight中可以看到几何graphics时,我猜测这些三角形是被背面剔除的。 这是因为您创建的顶点的顺序与您正在使用的剔除模式不一致(换句话说,所有三角形现在都背离相机)。

您可以禁用背面剔除效果,或者(可能更好)反转创建的几何体的卷绕顺序。