gpt4 book ai didi

java - OpenGL 顶点数组和 GL_TRIANGLE_STRIP 绘图错误

转载 作者:行者123 更新时间:2023-11-29 06:04:08 24 4
gpt4 key购买 nike

我正在使用 GL_TRIANGLE_STRIPS 和 LWJGL OpenGL Java 绑定(bind)实现高度图。当我使用“GL_BEGIN/GL_END”绘制“直接”时,它工作得很好,但是当高度图太大时,它工作得很慢。

因为我想继续使用 VBO,所以我现在正在学习如何使用顶点数组。这是我遇到问题的地方,绘图是错误的。似乎 strip 的最后一个三角形返回到第一个。也许图片更好:

画得好: Good direct drawing

错误的顶点数组绘图: Bad vertex array drawing

我的普通绘图代码如下:

public void renderDirect() {
//adapt the camera to the map
float scale = 5.0f / Math.max(w - 1, l - 1);
GL11.glScalef(scale, scale, scale);
GL11.glTranslatef(-(float) (w - 1) / 2, 0.0f, -(float) (l - 1) / 2);

//choose map color
GL11.glColor3f(0.3f, 0.9f, 0.0f);

for (int z = 0; z < l - 1; z++) {
//Makes OpenGL draw a triangle at every three consecutive vertices
GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
for (int x = 0; x < w; x++) {
Vector3f normal = getNormal(x, z);
GL11.glNormal3f(normal.getX(), normal.getY(), normal.getZ());
GL11.glVertex3f(x, getHeight(x, z), z);
normal = getNormal(x, z + 1);
GL11.glNormal3f(normal.getX(), normal.getY(), normal.getZ());
GL11.glVertex3f(x, getHeight(x, z + 1), z + 1);
}
glEnd();
}
}

我的顶点数组绘制代码如下:

private void loadArrays(){
//calculate the length of the buffers
bLength = (l-1) * w * 6;
//create the normal and vertex buffer array's
dataBuffer = BufferUtils.createFloatBuffer(bLength*2);
cBuffer = BufferUtils.createFloatBuffer(bLength);

for (int z = 0; z < l - 1; z++) {
//Fill up the buffers
for (int x = 0; x < w; x++) {
Vector3f normal = getNormal(x, z);
dataBuffer.put(x).put(getHeight(x,z)).put(z);
dataBuffer.put(normal.getX()).put(normal.getY()).put(normal.getZ());
normal = getNormal(x, z + 1);
dataBuffer.put(x).put(getHeight(x,z+1)).put(z+1);
dataBuffer.put(normal.getX()).put(normal.getY()).put(normal.getZ());
}
}
}

int stride = 6*4;
public void renderDirect() {
//adapt the camera to the map
float scale = 5.0f / Math.max(w - 1, l - 1);
GL11.glScalef(scale, scale, scale);
GL11.glTranslatef(-(float) (w - 1) / 2, 0.0f, -(float) (l - 1) / 2);

//choose map color
GL11.glColor3f(0.3f, 0.9f, 0.0f);

//Draw the vertex arrays
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

dataBuffer.position(0);
glVertexPointer(3, stride, dataBuffer);
dataBuffer.position(3);
glNormalPointer(stride,dataBuffer);

glDrawArrays(GL_TRIANGLE_STRIP, 0, bLength/3);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}

我做错了什么?

最佳答案

像这样背靠背连接三角形带不会像您预期的那样工作。

在循环中调用 glDrawArrays() 调整 firstcount 参数来绘制原始的 N三角带,或添加 degenerate triangles到每一行的末尾以重置 strip 起始位置。

或者只使用 GL_TRIANGLES :)

关于java - OpenGL 顶点数组和 GL_TRIANGLE_STRIP 绘图错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com