[英]LWJGL texture render shifted in to directions when Rendering with VAO
所以这里是发生了什么的截图。
这也是制作 vao 的方法
public boolean create(float[] modelData) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(modelData.length);
buffer.put(modelData);
buffer.flip();
vaoID = glGenVertexArrays();
glEnableVertexAttribArray(0);
glBindVertexArray(vaoID);
vboID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vertexCount = modelData.length / 3;
return true;
}
以及添加 uv 坐标的那个
public void addUV(float[] uv) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(uv.length);
buffer.put(uv);
buffer.flip();
glBindVertexArray(vaoID);
uvCoordLoc = glGetAttribLocation(shade.getProgramID(), "uv");
glEnableVertexAttribArray(uvCoordLoc);
glVertexAttribPointer(uvCoordLoc, 2, GL_FLOAT, false, 0, buffer);
glDisableVertexAttribArray(uvCoordLoc);
glBindVertexArray(0);
}
最后是渲染的那个。
public void draw(int texID) {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texID);
int texLoc = glGetUniformLocation(shade.getProgramID(), "tex");
glUniform1i(texLoc, 0);
glBindVertexArray(vaoID);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(uvCoordLoc);
shade.start();
glDrawArrays(GL_QUADS, 0, vertexCount);
shade.stop();
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(uvCoordLoc);
glBindVertexArray(0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
}
还有我的着色器顶点着色器
#version 130
out vec4 theColor;
out vec2 uvCoord;
in vec2 uv;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
theColor = gl_Position;
uvCoord = uv;
}
片段着色器。
#version 130
in vec4 theColor;
in vec2 uvCoord;
uniform sampler2D tex;
void main() {
gl_FragColor = texture(tex, uvCoord).rgba;
}
我试过弄乱紫外线坐标,但这是我到目前为止所得到的。
和 model 数据和 uv 坐标
Model model = new Model();
model.create(new float[] {
-0.5f,-0.5f,-2f,
-0.5f,0.5f,-2f,
0.5f,0.5f,-2f,
0.5f,-0.5f,-2f
});
model.addUV(new float[] {
0,1,
0,0,
1,0,
1,1
});
你能帮忙的话,我会很高兴
当图像加载到纹理 object 时, GL_UNPACK_ALIGNMENT
必须设置为 1。
默认情况下GL_UNPACK_ALIGNMENT
为 4,因此假定图像的每一行对齐到 4 个字节。 如果图像中像素的大小不是 4 的倍数(例如GL_RGB
或GL_RED)
,那么这将导致未对齐。
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.