我使用LWJGL和GLFW在java中创建了一个简单的opengl应用程序。
我创建了一个用于渲染纹理框的类。它创建顶点位置,纹理坐标,并使用VBO。该框使用GL_QUADS
呈现。
当我启动程序来测试它时,有时:
- 输出正确,我看到框正确呈现。
- 开箱即用的非常大,奇怪的(白色/灰色)三角形。
- 盒子完全变形,就像有很多三角形完全随机。
当我不更改任何代码时,结果每次都会有所不同。但有时候框正确呈现。
我非常确定我的顶点和纹理坐标是正确的。
很难找到错误的地方。我重新创建了box类,因此它使用texture.bind();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, texId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, vertices.length);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
Texture.unbind();
呈现它(当然还要重新考虑顶点/纹理坐标)。
但后来我仍然得到了同样奇怪的行为。
很难的是每次程序运行时结果都不同,而代码没有被编辑。
等等......
有人知道会发生什么吗? 这就是我渲染框的方式:
package shapes;
import static org.lwjgl.opengl.GL11.GL_FLOAT;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_COORD_ARRAY;
import static org.lwjgl.opengl.GL11.GL_TRIANGLES;
import static org.lwjgl.opengl.GL11.GL_VERTEX_ARRAY;
import static org.lwjgl.opengl.GL11.glDisable;
import static org.lwjgl.opengl.GL11.glDisableClientState;
import static org.lwjgl.opengl.GL11.glDrawArrays;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glEnableClientState;
import static org.lwjgl.opengl.GL11.glTexCoordPointer;
import static org.lwjgl.opengl.GL11.glVertexPointer;
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
import static org.lwjgl.opengl.GL15.glBindBuffer;
import static org.lwjgl.opengl.GL15.glBufferData;
import static org.lwjgl.opengl.GL15.glGenBuffers;
import java.nio.FloatBuffer;
import main.Geometry;
import org.lwjgl.BufferUtils;
import textures.Texture;
public class TriangleBox extends Geometry {
private float sizeX;
private float sizeY;
private float sizeZ;
private short[] indices;
private float[] texCoords;
private int vboId;
private int texId;
private int indId;
private Texture texture;
/**
* Creates a beam figure (a bar)
*
* @param widthX
* @param heightY
* @param depthZ
*/
public TriangleBox(float widthX, float heightY, float depthZ, Texture tex) {
this.sizeX = widthX;
this.sizeY = heightY;
this.sizeZ = depthZ;
this.setTexture(tex);
this.createVertices();
this.createVBO();
}
public void setTexture(Texture tex) {
this.texture = tex;
}
protected void createVertices() {
vertices = new float[] {
//Bottom
0, 0, 0,
1, 0, 0,
0, 0, 1,
0, 0, 1,
1, 0, 0,
1, 0, 1,
//Top
0, 1, 0,
1, 1, 0,
0, 1, 1,
0, 1, 1,
1, 1, 0,
1, 1, 1,
//Front
0, 1, 1,
1, 1, 1,
0, 0, 1,
0, 0, 1,
1, 1, 1,
1, 0, 1,
//Back
1, 1, 0,
0, 1, 0,
1, 0, 0,
1, 0, 0,
0, 1, 0,
0, 0, 0,
//Left
0, 1, 0,
0, 1, 1,
0, 0, 0,
0, 0, 0,
0, 1, 1,
0, 0, 1,
//Right
1, 1, 1,
1, 1, 0,
1, 0, 1,
1, 0, 1,
1, 1, 0,
1, 0, 0,
};
texCoords = new float[] {
// Bottom
0f, .33f,
.25f, .33f,
0f, .66f,
0f, .66f,
.25f, .33f,
.25f, .66f,
// Top
.75f, .33f,
.50f, .33f,
.75f, .66f,
.75f, .66f,
.50f, .33f,
.50f, .66f,
// Front
0f, 1f ,
.25f, 1f ,
0f, .66f,
0f, .66f,
.25f, 1f ,
.25f, .66f,
// Back
.25f, 0f ,
0f, 0f ,
.25f, .33f,
.25f, .33f,
0f, 0f ,
0f, .33f,
// Left
.75f, .33f,
.75f, .66f,
1f, .33f,
1f, .33f,
.75f, .66f,
1f, .66f,
// Right
.50f, .66f,
.50f, .33f,
.25f, .66f,
.25f, .66f,
.50f, .33f,
.25f, .33f
};
}
public void createVBO() {
FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(vertices.length);
vertexBuffer.put(vertices);
vertexBuffer.flip();
FloatBuffer texCoordBuffer = BufferUtils.createFloatBuffer(texCoords.length);
texCoordBuffer.put(texCoords);
texCoordBuffer.flip();
vboId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, vertexBuffer, GL_STATIC_DRAW);
texId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, texId);
glBufferData(GL_ARRAY_BUFFER, texCoordBuffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
public void render() {
texture.bind();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, texId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, vertices.length);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
Texture.unbind();
}
}
如果有人知道导致改变结果的原因,它已经有所帮助。
我的盒子类的代码:
#version 120
attribute vec3 position;
void main() {
gl_Position = vec4(position.x, position.y, position.z, 1.0);
}
顶点着色器:
#version 120
void main() {
gl_FragColor = gl_Color; //vec4(0.1, 1.0, 1.0, 1.0);
}
片段着色器
Include /test/custom.conf
答案 0 :(得分:0)
因为在图片中你从不同的角度显示框,我最好的猜测仍然是,顶点有问题。所以也许每次运行时都不会得到不同的结果,但实际上只能从不同的角度看到相同的结果,这会因为面部清理或其他原因使对象显得不同。
尝试渲染四边形(更容易确定正确的顶点)并查看是否仍然得到相同的结果。