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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |