2010-11-09 4 views
2

Когда я добавляю шейдеры (в cg) в мою программу opengl, все локальные преобразования (glRotatef, glTranslatef и glScalef между glPushMatrix и glPopMatrix) перестают работать. Тем не менее, преобразование снаружи push/pop все еще работает. Так в чем проблема?Shader and opengl transformations

обновление: У меня есть вращающийся куб в центре сцены:

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 
); 

Vertex код шейдера:

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; 
} 

Так что в конце куб не вращается, но если я это сделаю (нет push/pop)

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

все работает нормально. Как это исправить?

+0

Можете ли вы подробно остановиться на «прекращении работы»? Укажите ожидаемый вывод и фактический результат ... Некоторые примеры кода тоже не будут ошибочными. – LarsH

+0

я обновил главный пост, пожалуйста, проверьте его – spacevillain

ответ

3

Вы можете использовать конвейер с фиксированной функцией или программируемый. Поскольку вы переключились на шейдеры, конвейер с фиксированной функцией «перестал работать». Чтобы переключиться обратно, вам нужно glUseProgram(0). И вам нужно отправить эти локальные преобразования в шейдер.

+0

как я могу отправить преобразования в шейдер? и я обновил основную запись – spacevillain

+2

@spacevillain: в вашем случае вам нужно отправить 'modelViewProj' и' modelView' вручную, взгляните на этот фрагмент кода: http://stackoverflow.com/questions/3740905/what-is -gl-modelviewmatrix-и-л-modelviewprojectionmatrix-в-современной-OpenGL/3741453 # 3741453 – erjot