2010-11-09 167 views
2

当我添加着色器(在cg中)到我的opengl程序中时,所有局部转换(glRushatef,glTranslatef和glScalef在glPushMatrix和glPopMatrix之间)停止工作。转换外推/流行仍然工作。那么这里可能是什么问题?着色器和opengl转换

更新: 我在场景的中心旋转的立方体:

glPushMatrix(); 
glRotatef(angle, 1, 0, 0); 
drawBox(); 
glPopMatrix(); 

之后,我发的世界观和worldviewprojection矩阵着色器:

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

您能否详细说明“停止工作”?指定预期的输出和实际的输出...一些示例代码也不会有问题。 – LarsH 2010-11-09 10:46:30

+0

我更新了主帖,请检查一下 – spacevillain 2010-11-09 13:21:24

回答

3

您可以使用固定功能管线或可编程管线。由于您切换到着色器,固定功能管道“停止工作”。切换回你需要glUseProgram(0)。你需要将这些局部变换发送给着色器。

+0

我如何发送转换到着色器?我更新了主要帖子 – spacevillain 2010-11-09 13:23:02

+2

@spacevillain:在你的情况下,你需要手动发送'modelViewProj'和'modelView',看看这个代码片段:http://stackoverflow.com/questions/3740905/what-is -gl-modelviewmatrix和-GL-modelviewprojectionmatrix,在现代的OpenGL/3741453#3741453 – erjot 2010-11-10 12:56:33