2010-11-09 247 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