2014-04-26 5 views
2

LWJGL을 사용하여 텍스처를 렌더링하려고 할 때 어떤 이유로 텍스처가 단색으로 만 렌더링됩니다. 나는 질감이 이미지의 지배적 인 색 인 것처럼 보이기 때문에 텍스처로드 (Slick Util 라이브러리를 사용하고 있습니다)에 문제가 있다고 생각하지 않습니다.LWJGL - 텍스처 만 단색으로 표시됩니다.

모델 클래스 :

public class Model { 

private FloatBuffer vertices, uvValues; 
private int vertexID, uvID; 
private int vertexAttrib, uvAttrib; 

private Texture tex; 
private ByteBuffer texData; 
private int textureID; 
private int textureLocation; 

private Matrix4f modelMatrix; 
private FloatBuffer modelBuffer; 
private int modelMatrixLocation; 

public Model(float[] verts, float[] uvs, int modelLocation, String texPath, int texLocation){ 
    vertices = createBuffer(verts); 
    vertexAttrib = 0; 
    vertexID = createVBO(vertices, vertexAttrib, 3); 

    tex = TextureUtils.loadTexturePNG(texPath); 
    texData = createBuffer(tex); 
    textureID = bindTextureData(tex, texData); 
    textureLocation = texLocation; 

    uvValues = createBuffer(uvs); 
    uvAttrib = 1; 
    uvID = createVBO(uvValues, uvAttrib, 2); 

    modelMatrix = new Matrix4f(); 
    modelMatrixLocation = modelLocation; 
    modelBuffer = createBuffer(modelMatrix); 
} 

private static FloatBuffer createBuffer(float[] vals){ 
    FloatBuffer buffer = BufferUtils.createFloatBuffer(vals.length); 
    buffer.put(vals); 
    buffer.flip(); 

    return buffer; 
} 

private static FloatBuffer createBuffer(Matrix4f mat){ 
    FloatBuffer buffer = BufferUtils.createFloatBuffer(16); 
    mat.store(buffer); 
    buffer.flip(); 

    return buffer; 
} 

private static ByteBuffer createBuffer(Texture tex){ 
    ByteBuffer buffer = BufferUtils.createByteBuffer(tex.getTextureData().length); 
    buffer.put(tex.getTextureData()); 
    buffer.flip(); 

    return buffer; 
} 

private static int bindTextureData(Texture tex, ByteBuffer data){ 
    int id = glGenTextures(); 
    glBindTexture(GL_TEXTURE_2D, id); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (int) tex.getWidth(), (int) tex.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, data); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glBindTexture(GL_TEXTURE_2D, 0); 

    return id; 
} 

private static int createVBO(FloatBuffer buffer, int location, int vectorSize){ 
    int id = glGenBuffers(); 

    glEnableVertexAttribArray(location); 
    glBindBuffer(GL_ARRAY_BUFFER, id); 
    glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW); 
    glVertexAttribPointer(location, vectorSize, GL_FLOAT, false, 0, 0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glDisableVertexAttribArray(location); 

    return id; 
} 

private void bind(){ 
    glUniformMatrix4(modelMatrixLocation, false, modelBuffer); 

    tex.bind(); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glUniform1i(textureLocation, 0); 

    glEnableVertexAttribArray(vertexAttrib); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexID); 
    glVertexAttribPointer(vertexAttrib, 3, GL_FLOAT, false, 0, 0); 

    glEnableVertexAttribArray(uvAttrib); 
    glBindBuffer(GL_ARRAY_BUFFER, uvID); 
    glVertexAttribPointer(uvAttrib, 2, GL_FLOAT, false, 0, 0); 
} 

private void unbind(){ 
    glDisableVertexAttribArray(uvAttrib); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glDisableVertexAttribArray(vertexAttrib); 

    glBindTexture(GL_TEXTURE_2D, 0); 
} 

public void render(){ 
    bind(); 

    glDrawArrays(GL_TRIANGLES, 0, vertices.capacity()/3); 

    unbind(); 
} 

} 

모델 초기화 코드 :

 model = new Model(new float[]{ 
     -1, -1, -3, 
     1, -1, -3, 
     1, 1, -3 
    }, new float[]{ 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
     1.0f, 1.0f 
    }, program.getUniformLocation("model_matrix"), "res/tex/testTex.png", program.getUniformLocation("texture_sampler")); 

버텍스 쉐이더 :

#version 330 core 

layout(location = 0) in vec3 position_modelspace; 

layout(location = 1) in vec2 vertex_UV; 

uniform mat4 model_matrix; 
uniform mat4 view_matrix; 
uniform mat4 projection_matrix; 

out vec2 UV; 

void main(){ 
vec4 vertex_MVP = projection_matrix * view_matrix * model_matrix * vec4(position_modelspace, 1.0); 
gl_Position = vertex_MVP; 

UV = vertex_UV; 
} 

조각 쉐이더 :

#version 330 core 

uniform sampler2D texture_sampler; 

in vec2 UV; 

out vec3 color; 

void main(){ 
color = texture(texture_sampler, UV).rgb; 
} 

문제가 무엇인지 잘 모르겠습니다. 텍스처는 아무런 문제없이로드되고 비슷한 문제가있는 다른 많은 질문을 보았습니다. 그러나 아직이 문제를 해결하지 못했습니다.

+0

를 해결할 수 glEnable(GL_TEXTURE_2D);를 추가, 왜 당신은 *** 전 *** 활성 텍스처 이미지 단위를 설정 바인딩? 사실'glBindTexture (...)'와 같은 시간에'tex' 객체를 바인딩 할 것을 기대할 것입니다. 사실 그들은 같은 일을한다고 생각합니다. –

+0

Slick Util 라이브러리의 Texture 클래스를 사용하고 있습니다. 나는 tex.bind()를 제거했으나 차이를 만들지 않았다. – Spaxxy

+0

나는 그럴 것이라고 생각하지 않았지만, 길잃은 결속은 이상하게 보였다. 또한, 당신의'createVBO (...)'메소드는 즉시 사용 불가능한 속성 포인터를 가능하게하는 것과 같은 불필요한 일을한다. 포인터가 활성화 또는 비활성화되었는지 여부는'glDrawArrays (...) '를 호출 할 때만 중요합니다. 그 상태는 다른 것에 영향을 미치지 않습니다. 마찬가지로,'GL_ARRAY_BUFFER'에 바인딩 된 VBO를 유지하는데 해가 없습니다. VBO가 아닌 버텍스 배열을 사용하지 않는 한 Binding ** 0 **은 불필요합니다. –

답변

-2

아마 문제이`Texture` 클래스 모양 등의 구현을 무엇

+0

'GL_TEXTURE _...'enable은 고정 함수 파이프 라인을 위해 _only_ 필요하다. 셰이더를 사용할 때 아무 효과가 없습니다. 핵심 프로파일 GL에서 이것을 호출하면 오류가 발생합니다. – derhass