2

当我将着色器(在 cg 中)添加到我的 opengl 程序时,所有本地转换(glRotatef、glTranslatef 和 glPushMatrix 和 glPopMatrix 之间的 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();

一切正常。我该如何解决?

4

1 回答 1

3

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

于 2010-11-09T11:49:47.717 回答