加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 气质ID3D10EffectVectorVariable

发布时间:2020-12-16 07:28:18 所属栏目:百科 来源:网络整理
导读:我在许多地方以下列方式设置HLSL效果变量. extern ID3D10EffectVectorVariable* pColour;pColour = pEffect-GetVariableByName("Colour")-AsVector();pColour-SetFloatVector(temporaryLines[i].colour); 在其中一个位置设置在循环中,向量temporaryLines中的
我在许多地方以下列方式设置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);   //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,&pBuffer,&offset);
device->IASetIndexBuffer(iBuffer,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);
}

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};    // the light's color
float4   AmbientCol = {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中定义,只是普通的着色器变量.
也许变量应该定义在Constant buffer,每帧updateblae?类似于应该如何定义世界和视图矩阵.至少GPU知道每次渲染时都要更新颜色变量. (因为您在绘制之前更新了值).

cbuffer cbChangesEveryFrame
{

    //The MVP matrices.
    matrix World;
    matrix View;
    float4   Colour;

}

我要考虑的另一点是每次在绘制调用(或通过循环)之前获取指向技术desc的指针,
并没有重复使用它,似乎也有所作为.

//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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读