Текстура OpenGL ES 2.0 выглядит черной - PullRequest
2 голосов
/ 28 января 2012

Я работаю над приложением, использующим OpenGL ES 2.0 для встроенного устройства.

Это мой фрагментный шейдер:

varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main() {
  gl_FragColor = texture2D(s_texture, v_texCoord);
}

Я правильно настроил текстуры.По какой-то причине вызов glTexImage2D не дает результата, который я ищу.Текстура полностью черная, а не заполнена данными, которые я ей предоставляю.

Вот как я создаю текстуру:

   GLuint textureId;

   // 2x2 Image, 3 bytes per pixel (R, G, B)
   GLubyte pixels[6 * 3] =
   {  
      255,   0,   0, // Red
        0, 255,   0, // Green
        0,   0, 255, // Blue
      255, 255,   0,  // Yellow
        0, 255, 255,
        255, 0, 255
   };

   // Use tightly packed data
   glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );

   // Generate a texture object
   glGenTextures ( 1, &textureId );

   // Bind the texture object
   glBindTexture ( GL_TEXTURE_2D, textureId );

   // Load the texture
   glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGB, 3, 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 );

После этого я связываю текстуру следующим образом:

samplerLoc = glGetUniformLocation ( userData->programObject, "s_texture" );
glActiveTexture ( GL_TEXTURE0 );
glBindTexture ( GL_TEXTURE_2D, textureId );

// Set the sampler texture unit to 0
glUniform1i ( samplerLoc, 0 );

Я подтвердил, что координаты вершины и текстурысвязаны и передаются шейдерам при отладке.Таким образом, проблема должна быть в s_texture или самой функции glTexImage2D.

Ответы [ 2 ]

7 голосов
/ 28 января 2012

Вам необходимо установить режимы зажима на CLAMP_TO_EDGE для измерений U и V, в противном случае текстура будет неполной и будет иметь черный цвет.

2 голосов
/ 28 января 2012

Возможно, я упускаю что-то очевидное, но если вы сохраняете только 2 x 2 пикселя с 3 байтами на цвет (= 4 x 3 байта = 12 байтов) в качестве текстуры;тогда откуда 6 в «GLubyte пикселях [6 * 3]» взято?

6 * 3 равно 18 и! = power 2

// Загрузка текстуры glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 3, 2 , 0, GL_RGB, GL_UNSIGNED_BYTE, пиксели);

Из спецификации: glTexImage2D (цель GLenum, уровень GLint, внутренний формат GLint, ширина GLsizei, высота GLsizei , граница GLint, формат GLenum, тип GLenum, const GLvoid * данные);

лучше всего использовать полужирные переменные ^ 2 ...

Итакпопробуйте следующее:

// Загрузка текстуры glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 2, 2 , 0, GL_RGB, GL_UNSIGNED_BYTE, пиксели);

Удалите последние 2 строки из массива пикселей, затем измените все значения на «255»;если вы получаете белую текстуру, это означает, что она работает.

Другой пример:

GLubyte пикселей [4 * 3] = {

255, 0, 0, // Красный // Зеленый // Синий // Пиксель 0

255, 0, 0, // Красный // Зеленый // Синий // Пиксель 1

255, 0, 0, // Красный // Зеленый // Синий // Пиксель 2

255, 0, 0 // Красный // Зеленый // Синий // Пиксель 3

};

И все отображается красным.

Если этого не произойдет, возможно, мой код поможет:

void CMesh::renderMesh(GLuint program, glm::mat4 *mvp){

glUseProgram(program);

int mvpLocation = glGetUniformLocation(program, "matViewProjection");
int texLocation = glGetUniformLocation(program, "baseMap");
glUniformMatrix4fv( mvpLocation, 1, GL_FALSE, glm::value_ptr(*mvp));

int vertexAttribLocation = glGetAttribLocation(program, "vertex");
int uvAttribLocation = glGetAttribLocation(program, "texturecoordinate");

// Bind our texture in Texture Unit 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureIndex);
glUniform1i(texLocation, 0);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(
   vertexAttribLocation,            
   3,                               // size
   GL_FLOAT,                        // type
   GL_FALSE,                        // normalized?
   0,                               // stride
   (void*)0                         // array buffer offset
);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, uvBuffer);
glVertexAttribPointer(
   uvAttribLocation,                  
   2,                  // size
   GL_FLOAT,           // type
   GL_FALSE,           // normalized?
   0,                  // stride
   (void*)0            // array buffer offset
);

// Draw the triangles !
glDrawArrays(GL_TRIANGLES, 0, vertices.size() );

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
};
...