temperamental ID3D10EffectVectorVariable

temperamental ID3D10EffectVectorVariable

本文关键字:ID3D10EffectVectorVariable temperamental      更新时间:2023-10-16

我在一些地方以以下方式设置HLSL效果变量。

extern ID3D10EffectVectorVariable* pColour;
pColour = pEffect->GetVariableByName("Colour")->AsVector();
pColour->SetFloatVector(temporaryLines[i].colour);

在循环中设置的其中一个地方,向量temporaryLines中的每一行都有一个与之相关的D3DXCOLOR变量。这个问题最恼人的地方是,它在极少数情况下是有效的,但大多数情况下是无效的。这种代码有什么已知的问题吗?

void GameObject::Draw(D3DMATRIX matView, D3DMATRIX matProjection)
{
device->IASetInputLayout(pVertexLayout);
mesh.SetTopology();//TODO should not be done multiple times
// select which vertex buffer and index buffer to display
UINT stride = sizeof(VERTEX);
UINT offset = 0;
device->IASetVertexBuffers(0, 1, mesh.PBuffer(), &stride, &offset);
device->IASetIndexBuffer(mesh.IBuffer(), DXGI_FORMAT_R32_UINT, 0);
pColour->SetFloatVector(colour);
// create a scale matrix
D3DXMatrixScaling(&matScale, scale.x, scale.y, scale.z);
// create a rotation matrix
D3DXMatrixRotationYawPitchRoll(&matRotate, rotation.y, rotation.x, rotation.z);
// create a position matrix
D3DXMatrixTranslation(&matTranslation, position.x, position.y, position.z);
// combine the matrices and render
matFinal = 
    matScale        * 
    matRotate       * 
    matTranslation  * 
    matView * matProjection;
pTransform->SetMatrix(&matFinal._11); 
pRotation->SetMatrix(&matRotate._11);    // set the rotation matrix in the effect
pPass->Apply(0);
device->DrawIndexed(mesh.Indices(), 0, 0);   //input specific
}

这里是偶尔的作品:

void BatchLineRenderer::RenderLines(D3DXMATRIX matView, D3DXMATRIX matProjection)
{
device->IASetInputLayout(pVertexLayout);
device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP);
// select which vertex buffer and index buffer to display
UINT stride = sizeof(LINE);
UINT offset = 0;
device->IASetVertexBuffers(0, 1, &pBuffer, &stride, &offset);
device->IASetIndexBuffer(iBuffer, DXGI_FORMAT_R32_UINT, 0);
allLines = temporaryLines.size();
for(int i = 0; i < allLines; i++)
{
    pColour->SetFloatVector(temporaryLines[i].colour); // in the line loop too?
    // combine the matrices and render
    D3DXMATRIX matFinal = 
        temporaryLines[i].scale * 
        temporaryLines[i].rotation * 
        temporaryLines[i].position * 
        matView * matProjection;
    pTransform->SetMatrix(&matFinal._11); 
    pRotation->SetMatrix(&temporaryLines[i].rotation._11);    // set the rotation matrix in the effect
    pPass->Apply(0);
    device->DrawIndexed(2, 0, 0);
}
temporaryLines.clear();
}

效果文件:

float4x4 Transform;    // a matrix to store the transform
float4x4 Rotation;     // a matrix to store the rotation transform
float4   LightVec   = {0.612f, 0.3535f, 0.612f, 0.0f};    // the light's vector
float4   LightCol   = {1.0f,   1.0f,    1.0f,   1.0f};    // the light's color
float4   AmbientCol = {0.3f,   0.3f,    0.3f,   1.0f};    // the ambient light's color
float4   Colour;
// a struct for the vertex shader return value
struct VSOut
{
    float4 Col : COLOR;    // vertex normal
    float4 Pos : SV_POSITION;    // vertex screen coordinates
};
// the vertex shader
VSOut VS(float4 Norm : NORMAL, float4 Pos : POSITION)
{
    VSOut Output;
    Output.Pos = mul(Pos, Transform);    // transform the vertex from 3D to 2D
    Output.Col = AmbientCol;    // set the vertex color to the input's color
    float4 Normal = mul(Norm, Rotation);
    Output.Col += saturate(dot(Normal, LightVec)) * LightCol * Colour; // add the diffuse and passed in light
    return Output;    // send the modified vertex data to the Rasterizer Stage
}
// the pixel shader
float4 PS(float4 Col : COLOR) : SV_TARGET
{
    return Col;    // set the pixel color to the color passed in by the Rasterizer Stage
}
// the primary technique
technique10 Technique_0
{
    // the primary pass
    pass Pass_0
    {
        SetVertexShader(CompileShader(vs_4_0, VS()));
        SetGeometryShader(NULL);
        SetPixelShader(CompileShader(ps_4_0, PS()));
    }
}

所以color HLSL变量没有在ConstantBuffer中定义,只是一个正常的着色器变量。也许变量应该定义在一个常量缓冲区,每帧更新?类似于如何定义世界和视图矩阵。至少GPU知道你想要在每次渲染时更新颜色变量。(当你在绘制之前更新值时)。

cbuffer cbChangesEveryFrame
{
    //The MVP matrices.
    matrix World;
    matrix View;
    float4   Colour;
}

我要考虑的另一点是每次在draw调用(或传递循环)之前获得技术参数的指针,而不重复使用,似乎也会产生影响。

//Initiate the pass through loop for the shader effect.
technique->GetDesc(&desc);
for (UINT p=0; p<desc.Passes; p++)
{
    //Apply this pass through.
    technique->GetPassByIndex(p)->Apply(0);
    //draw indexed, instanced.
    device->device->DrawIndexedInstanced(indicesCount, (UINT) instanceCount, 0, 0, 0);
}
相关文章:
  • 没有找到相关文章