Преобразования шейдеров и opengl - PullRequest
2 голосов
/ 09 ноября 2010

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

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

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

Таким образом, в конце куб не вращается, но если я пишу (нет push / pop)

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

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

1 Ответ

3 голосов
/ 09 ноября 2010

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

...