Нужна помощь в поиске ошибки в коде с текстурами в Open GL ES 2.0 с использованием шейдеров - PullRequest
2 голосов
/ 16 февраля 2012

Я использовал руководство по программированию Open GL ES 2.0 и следую главе 9 о текстурах, но я настроил тот же массив пикселей (2x2 - красный, зеленый, синий, желтый), и он показывает только красный цвет для всего треугольника.Не могу найти проблему, я думаю, что мои шейдеры тоже в порядке, пожалуйста, помогите моему коду следующим образом.

- (void)setupGL
   {
    [EAGLContext setCurrentContext:self.context];

    [self loadShaders];

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_SRC_COLOR);

    glGenVertexArraysOES(1, &_vertexArray);
    glBindVertexArrayOES(_vertexArray);

    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(gRectVertexData), gRectVertexData, GL_STATIC_DRAW);

// 2 x 2 Image, 3 bytes per pixel(R, G, B) 
GLubyte pixels[12] =
{
    255,0,0, // Red 
    0,255,0, // Green
    0,0,255, // Blue
    0,255,255 // Yellow 
};
    // Use tightly packed data
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    // Generate a texture object 
glGenTextures(1, &texture[0]);
    // Bind the texture object 
glBindTexture(GL_TEXTURE_2D, texture[0]);
    // Load the texture
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 2,2, 0, GL_RGB,
                 GL_UNSIGNED_BYTE, pixels);
// Set the filtering mode
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    GLint SamplerLoc = glGetUniformLocation(_program, "Texture");
glUniform1i(SamplerLoc, 0);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(12));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(24));

glBindVertexArrayOES(0);

}

У меня есть это в моей части загрузки шейдеров

glBindAttribLocation(_program, ATTRIB_VERTEX, "position");
glBindAttribLocation(_program, ATTRIB_NORMAL, "normal");
glBindAttribLocation(_program, ATTRIB_TEX, "TexCoordIn");

тогда мой вершинный шейдер и фрагментный шейдер выглядят следующим образом

attribute vec4 position;
attribute vec3 normal;
attribute vec2 TexCoordIn;

varying lowp vec4 colorVarying;
varying vec2 TexCoordOut;

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
  vec3 eyeNormal = normalize(normalMatrix * normal);
  vec3 lightPosition = vec3(0.0, 0.0, 1.0);
  vec4 diffuseColor = vec4(0.8, 0.4, 1.0, 1.0);

  float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));

  colorVarying = diffuseColor*nDotVP;

  gl_Position = modelViewProjectionMatrix * position;
  TexCoordOut = TexCoordIn;
}

Фрагментный шейдер

varying lowp vec4 colorVarying;
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;

void main()
{
lowp vec4 col = texture2D(Texture, TexCoordOut);
col.x *= colorVarying.x;
col.y *= colorVarying.x;
col.z *= colorVarying.x;
col.a = 1.0;
    gl_FragColor =  col;
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Измените свой звонок

glBindAttribLocation(_program, ATTRIB_TEX, "TexCoordIn");

, чтобы использовать GLKVertexAttribTexCoord0 вместо вашего ATTRIB_TEX перечисления.

Это надоедливый гоч в проекте OpenGL Game. Члены перечисления, которые они используют в своих glBindAttribLocation вызовах для позиций и нормалей, имеют те же значения, что и перечисления GLKVertexAttribPosition и GLKVertexAttribNormal, но это просто совпадение.

Проверьте почту в headnoodles для пошаговых инструкций. В примере используется GLKit, но все остальное должно быть таким же.

0 голосов
/ 16 февраля 2012

Что произойдет, если вы просто выведете координаты текстуры?

Видите ли вы градиент от [0-1]?

...