着色器和opengl转换

时间:2010-11-09 09:54:15

标签: opengl shader cg

当我向我的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();
一切正常。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可以使用固定功能管道或可编程管道。由于您切换到着色器,固定功能管道“停止工作”。要切换回来,您需要glUseProgram(0)。并且您需要将这些本地转换发送到着色器。