Проблемы времени выполнения OpenGL Vertex Shader (без использования VBO или текстур) - PullRequest
1 голос
/ 22 ноября 2011

У меня есть следующий вершинный шейдер:

uniform mat4 uMVP;
attribute vec4 aPosition;
attribute vec4 aNormal;
attribute vec2 aTexCoord;
varying vec2 vTexCoord;
varying vec4 vPrimaryColor;
void main() {
  gl_Position = uMVP * aPosition;
  vPrimaryColor = vec4(1.0, 1.0, 1.0, 1.0);
  vTexCoord = aTexCoord;
}

И следующий фрагментный шейдер:

uniform sampler2D sTex;
varying vec2 vTexCoord;
varying vec4 vPrimaryColor;
void main() {
  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

Обратите внимание, что хотя у меня есть vTexCoord и vPrimaryColor, ни один из которых не используется вфрагментный шейдер.(Причина, по которой они есть, заключается в том, что они в конечном итоге будут).

Теперь я также установил uMVP в качестве матрицы тождеств на данный момент и рисую, используя следующий код:

// Load the matrix
glUniformMatrix4fv(gvMVPHandle, 1, false, &mvPMatrix.matrix[0][0]);

// Draw the square to be textured
glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glEnableVertexAttribArray(gvPositionHandle);
glVertexAttribPointer(gvTexCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glDrawArrays(GL_QUADS, 0, 4);

где квадрат:

const GLfloat PlotWidget::gFullScreenQuad[] = { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f};

Итак, когда я запускаю эту программу, я получаю черный экран.Что не похоже на то, что вы ожидаете.Однако, когда я меняю линию в тени:

vTexCoord = aTexCoord;

На

vTexCoord = vec2(1.0, 1.0);

Это работает отлично.Так что я бы предположил, что проблема с кодом связана с этой строкой кода, но я не могу придумать ничего, что могло бы вызвать это в opengl.Также я использую Qt для этого проекта, что означает, что этот класс использует QGLWidget.У меня никогда не было этой проблемы с OpenGL ES 2.0.

Есть предложения?

Извините за смутное название, но я даже не знаю, к какому классу это может быть..

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Проверяете ли вы glGetShaderInfoLog и glGetProgramInfoLog во время компиляции шейдера? Если нет, то я бы рекомендовал это как первый порт захода.

Следующим, что нужно проверить, будет привязка текстурных координат. Правильно ли установлены атрибуты? Данные действительны?

Наконец, начните шагать по своему коду с либеральным распылением вызовов glGetError . Это почти наверняка потерпит неудачу на glDrawArrays, которые не очень вам помогут, но обычно это происходит, когда для меня наступает отчаяние!

OR

Вы можете попробовать gDEBugger . Я использую его в основном для поиска узких мест и для того, чтобы убедиться, что я правильно высвобождаю ресурсы OpenGL, поэтому не могу поручиться за отладчик, но это стоит попробовать.

0 голосов
/ 01 декабря 2011

Та же проблема, другая причина.

Для некоторых устройств автоматическое связывание переменных в glLinkProgram не работает, как указано.

Убедитесь, что все сделано в следующем порядке:

  1. glCreateProgram

  2. glCreateShader && glCompileShader для обоих шейдеров

  3. glBindAttribLocation для всех атрибутов

  4. glLinkProgram

Шаг 3 можно повторить позже в любое время, чтобы привязать переменные к различным слотам буфера - однако изменения вступают в силу только после другого вызова glLinkgProgram.

или кратко: всякий раз, когда вы вызываете glBindAttribLocation, убедитесь, что вызовы glLinkProgram идут после.

0 голосов
/ 23 ноября 2011

Очевидно, вам действительно нужно использовать все значение glEnableVertexAttribArray, если оно передается в фрагментный шейдер.Я понятия не имею, почему, хотя.Но изменив код рисования на это:

glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glEnableVertexAttribArray(gvPositionHandle);
glVertexAttribPointer(gvTexCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, gFullScreenQuad);
glEnableVertexAttribArray(gvTexCoordHandle);
glDrawArrays(GL_QUADS, 0, 4);

заставил его работать.

...