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;
}
문제가 무엇인지 잘 모르겠습니다. 텍스처는 아무런 문제없이로드되고 비슷한 문제가있는 다른 많은 질문을 보았습니다. 그러나 아직이 문제를 해결하지 못했습니다.
를 해결할 수
glEnable(GL_TEXTURE_2D);
를 추가, 왜 당신은 *** 전 *** 활성 텍스처 이미지 단위를 설정 바인딩? 사실'glBindTexture (...)'와 같은 시간에'tex' 객체를 바인딩 할 것을 기대할 것입니다. 사실 그들은 같은 일을한다고 생각합니다. –Slick Util 라이브러리의 Texture 클래스를 사용하고 있습니다. 나는 tex.bind()를 제거했으나 차이를 만들지 않았다. – Spaxxy
나는 그럴 것이라고 생각하지 않았지만, 길잃은 결속은 이상하게 보였다. 또한, 당신의'createVBO (...)'메소드는 즉시 사용 불가능한 속성 포인터를 가능하게하는 것과 같은 불필요한 일을한다. 포인터가 활성화 또는 비활성화되었는지 여부는'glDrawArrays (...) '를 호출 할 때만 중요합니다. 그 상태는 다른 것에 영향을 미치지 않습니다. 마찬가지로,'GL_ARRAY_BUFFER'에 바인딩 된 VBO를 유지하는데 해가 없습니다. VBO가 아닌 버텍스 배열을 사용하지 않는 한 Binding ** 0 **은 불필요합니다. –