簡體   English   中英

OpenGL着色器未傳遞正確的紋理坐標

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM