[英]OpenGL shader not passing correct texture coordinates
在我的OpenGL應用程序中測試了幾件事之后,我知道我的紋理沒有正確加載,因為紋理坐標無法從頂點着色器傳遞到片段着色器(或者至少它們都以(0,0)的形式傳遞。)只是不知道為什么。
這是我的正方形的位置,索引和紋理坐標:
private static final float[] VERTICES = {
-0.5f, 0.5f, 0f,
-0.5f, -0.5f, 0,
0.5f, -0.5f, 0f,
0.5f, 0.5f, 0f
};
private static final int[] INDICES = {
0, 1, 2,
3, 0, 2
};
private static final float[] TEXTURE_COORDINATES = {
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
這是我如何在索引1的vao中插入紋理坐標的方法。為了簡潔起見,我不會顯示vao加載器的其他部分,因為它們處於正常工作狀態。
int vboTexCoordID = GL15.glGenBuffers();
ModelManager.recordVBO(vboTexCoordID);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboTexCoordID);
FloatBuffer texCoordBuffer = BufferUtils.createFloatBuffer(texCoord.length);
verticesBuffer.put(texCoord);
verticesBuffer.flip();
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, texCoordBuffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(1,2,GL11.GL_FLOAT, false, 0,0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
這是我的渲染方法:
model.getShader().start(); // this calls GL20.glUseProgram()
GL30.glBindVertexArray(model.getVaoID());
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexId());
GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVerticesCount(), GL11.GL_UNSIGNED_INT,0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);
model.getShader().stop();
最后是mt頂點着色器和片段着色器按此順序:
#version 330 core
in vec3 position;
in vec2 texCoords;
out vec2 pass_texCoords;
void main(void){
gl_Position = vec4(position.x, position.y, position.z, 1.0);
pass_texCoords = texCoords;
}
分段:
#version 330 core
in vec2 pass_texCoords;
out vec4 out_Color;
uniform sampler2D textureSampler;
void main(void){
out_Color = texture(textureSampler, pass_texCoords);
}
您永遠不會將數據添加到texCoordBuffer
:
FloatBuffer texCoordBuffer = BufferUtils.createFloatBuffer(texCoord.length);
verticesBuffer.put(texCoord);
verticesBuffer.flip();
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, texCoordBuffer, GL15.GL_STATIC_DRAW);
調用glBufferData()
, texCoordBuffer
為空,因為您將紋理坐標存儲在verticesBuffer
。 您需要將其更改為:
FloatBuffer texCoordBuffer = BufferUtils.createFloatBuffer(texCoord.length);
texCoordBuffer.put(texCoord);
texCoordBuffer.flip();
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, texCoordBuffer, GL15.GL_STATIC_DRAW);
您還需要確保用於頂點屬性的位置與頂點着色器匹配。 最簡單的方法是在頂點着色器代碼中使用layout
指令:
layout(location=0) in vec3 position;
layout(location=1) in vec2 texCoords;
這指定頂點着色器將從屬性0讀取位置,並從屬性1讀取紋理坐標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.