[英]OpenGL 3.3 texture mapping triangle
在過去的幾天里,我只是在Opengl 3.3(核心)中為一個三角形紋理化了一點運氣。 我可以成功渲染頂點和顏色,但紋理似乎有問題。 我當前的任務/目標只是頂點和紋理坐標(沒有顏色)。
由於我手工創建測試紋理,它應該顯示為16x16白色/紅色方格三角形。
奇怪的行為:如果我使用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:
您應該將片段着色器輸出變量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;
使用in vec2 tex;
。 名稱應該匹配。
在頂點着色器中,你有
out vec2 texCoordOut;
但在片段着色器中,您使用
in vec2 tex;
這不起作用,因為您需要使用相同的名稱,以便GL可以匹配它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.