当我向我的opengl程序添加着色器(在cg中)时,所有局部变换(glRotatef,glTranslatef和glPopMatrix之间的glTranslatef和glScalef)都停止工作。虽然在推/弹外转换仍在工作。那么这可能是什么问题呢?
更新: 我在场景的中心有一个旋转的立方体:
glPushMatrix();
glRotatef(angle, 1, 0, 0);
drawBox();
glPopMatrix();
然后我将世界观和世界观投影矩阵发送到着色器:
cgGLSetStateMatrixParameter(
myCgVertexParam_modelViewProj,
CG_GL_MODELVIEW_PROJECTION_MATRIX,
CG_GL_MATRIX_IDENTITY
);
cgGLSetStateMatrixParameter(
myCgVertexParam_modelView,
CG_GL_MODELVIEW_MATRIX,
CG_GL_MATRIX_IDENTITY
);
顶点着色器代码:
void C9E2v_fog(float4 position : POSITION,
float4 color : COLOR,
out float4 oPosition : POSITION,
out float4 oColor : COLOR,
out float fogExponent : TEXCOORD1,
uniform float fogDensity, // Based on log2
uniform float4x4 modelViewProj : MODELVIEW_PROJECTION_MATRIX,
uniform float4x4 modelView : MODELVIEW_MATRIX)
{
// Assume nonprojective modelview matrix
float3 eyePosition = mul(modelView, position).xyz;
float fogDistance = length(eyePosition);
fogExponent = fogDistance * fogDensity;
oPosition = mul(modelViewProj, position);
//oDecalCoords = decalCoords;
oColor = color;
}
所以最后立方体不旋转,但如果我写(没有推/弹)
glRotatef(angle, 1, 0, 0);
drawBox();
一切正常。我该如何解决这个问题?
答案 0 :(得分:3)
您可以使用固定功能管道或可编程管道。由于您切换到着色器,固定功能管道“停止工作”。要切换回来,您需要glUseProgram(0)
。并且您需要将这些本地转换发送到着色器。