OpenGL 3.3 треугольник отображения текстуры

В последние несколько дней мне не повезло, просто я текстурировал треугольник в Opengl 3.3 (ядро). Я могу успешно визуализировать вершины и цвета, но текстурирование кажется проблематичным. Моя текущая задача / цель — только вершины и координаты текстуры (без цветов).

Поскольку я создаю тестовую текстуру вручную, она должна отображаться в виде белого / красного клетчатого треугольника 16×16.

Странное поведение: если я использую GL_CLAMP_TO_EDGE, это все БЕЛЫЙ. Если я использую GL_REPEAT, он выходит розовый (белый + красный) …

вершинный шейдер:

#version 330
layout (location = 0) in vec3 vertPos;
layout (location = 1) in vec2 texCoord;
out vec2 tex;
uniform mat4 viewMatrix, projMatrix;
void main()
{
gl_Position = projMatrix * viewMatrix * vec4(vertPos,1.0);
tex = texCoord;
};

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

#version 330
out vec4 Color;
in vec2 tex;
uniform sampler2D texsampler;
void main() {
Color = texture(texsampler, tex);
};

код инициализации состояния (они в порядке, как показано):

  glPixelStorei(GL_UNPACK_ALIGNMENT,1);
//glPixelStorei(GL_PACK_ALIGNMENT,1);

glFrontFace(GL_CW);  // clockwise oriented polys are front faces
glCullFace(GL_BACK); // cull out the inner polygons... Set Culling property appropriately

glLineWidth(1.0f); // for any wireframe

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // color 1.0f is fully opaque, 0.0f is transparent

glDepthFunc(GL_LEQUAL);
glDepthRange(0,1); // default

glDisable(GL_CULL_FACE);

glClearColor(0.0f,0.0f,0.0f,1.0f); // set clear color to black

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); // filled polys

инициализация текстуры:

  glGenTextures(1,&texid1);
glBindTexture (GL_TEXTURE_2D, texid1);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

uint32 buf[16*16];
uint32 x;
for (x=0;x<16*16;) {
buf[x++] = 0xFFFFFFFF;
buf[x++] = 0xFFFF0000;
}

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8 , 16, 16, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)buf);

glBindTexture (GL_TEXTURE_2D, 0);

инициализация шейдера:

  shader1 = new_gl_shader_program(vert_src,frag_src);
if (shader1) {
if (link_gl_shader_program(shader1)) {

projMatrixLoc = glGetUniformLocation(shader1, "projMatrix");
viewMatrixLoc = glGetUniformLocation(shader1, "viewMatrix");

sampler2dLoc = glGetUniformLocation(shader1, "texsampler");

glBindFragDataLocation( shader1, 0, "Color" ); // ADDED.

}
else {
print("LINK ERROR: %s\n",get_gl_shader_msg());
delete_gl_shader_program(shader1);
shader1 = 0;
}
}
else
print("COMPILE/MISC ERROR: %s\n",get_gl_shader_msg());

if (!shader1)
return;

инициализация данных буфера:

typedef struct MESH_VERT_3D {
float x,y,z;
float u,v;
}MESH_VERT_3D;

MESH_VERT_3D meshbuf[3]; // total of 15 floats

meshbuf[0].x = 0.0f;
meshbuf[0].y = 0.0f;
meshbuf[0].z = 0.0f;

meshbuf[1].x = 1.0f;
meshbuf[1].y = 0.0f;
meshbuf[1].z = 0.0f;

meshbuf[2].x = 1.0f;
meshbuf[2].y = 0.0f;
meshbuf[2].z = 1.0f;

meshbuf[0].u = 0.0f;
meshbuf[0].v = 1.0f;
meshbuf[1].u = 1.0f;
meshbuf[1].v = 1.0f;
meshbuf[2].u = 1.0f;
meshbuf[2].v = 0.0f;

glGenBuffers(1, &vboid);
glBindBuffer(GL_ARRAY_BUFFER, vboid);
glBufferData(GL_ARRAY_BUFFER, sizeof(meshbuf), meshbuf, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);

glBindBuffer(GL_ARRAY_BUFFER, vboid);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*5, null);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(float)*5, (void*)(sizeof(float)*3));
glEnableVertexAttribArray(1);

glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);

визуализации:

  gls_begin_3d(&glscene);
use_gl_shader_program(shader1);

glUniformMatrix4fv(projMatrixLoc,  1, GL_FALSE, gls_get_projection_matrix());
glUniformMatrix4fv(viewMatrixLoc,  1, GL_FALSE, gls_get_modelview_matrix());

glActiveTexture(GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D, texid1);
glUniform1i(sampler2dLoc, 0);

glBindVertexArray(vaoHandle);

glDrawArrays(GL_TRIANGLES, 0, 3 );

glBindTexture (GL_TEXTURE_2D, 0);

use_gl_shader_program(0);
gls_end_3d(&glscene);

1

Решение

Выпуск 1:

Вы должны связать вашу выходную переменную фрагмента шейдера Color к фрагменту данных местоположения:

glBindFragDataLocation( shader1, 0, "Color" );

В противном случае OpenGL не знает, где находятся результаты вашей шейдерной программы.

Выпуск 2:

Вы создаете второй буферный объект для ваших текстурных координат: glGenBuffers(1, &tboid); Однако все должно быть помещено в один VBO.

Выпуск 3:

Вы передаете null в glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(float)*5, null); Однако начало текстурных координат не равно 0. Это sizeof(float)*3,

Выпуск 4:

В вершинном шейдере у вас есть out vec2 texCoordOut;, Однако в фрагментном шейдере вы используете
in vec2 tex;, Имена должны совпадать.

2

Другие решения

В вершинном шейдере у вас есть

out vec2 texCoordOut;

но во фрагментном шейдере вы используете

in vec2 tex;

Это не сработает, поскольку вы должны использовать одно и то же имя, чтобы GL мог сопоставить его.

1

По вопросам рекламы [email protected]