gpt4 book ai didi

java - opengl 3.2 drawElements,只有一个四边形可见

转载 作者:太空宇宙 更新时间:2023-11-04 13:56:30 24 4
gpt4 key购买 nike

编辑:我应该澄清一下......

这就是我计划的工作方式:

  1. 每次我的应用程序渲染(60hz)时,我都想将所有要渲染的顶点放入一个巨大的缓冲区中。然后,该缓冲区将上传到 GPU。 (glBufferdata)。

  2. 然后我将使用 glDrawElements 在一次调用中渲染整个内容。

这就是我尝试实现它的方式:

设置:1.创建一个巨大的FloatBuffer(java)2.初始化我的VOB(这对我来说仍然有点虚幻,但我认为我已经做对了。)我正在使用EBO来减少顶点。

渲染:1. 将大量顶点放入我的 FloatBuffer 中2.将我的floatbuffer上传到GPU3.使用glDrawElements渲染它。

结果:第一个四边形渲染得很好。其余所有内容根本不渲染。

问题为什么不是所有的四边形都渲染?

这就是我使用下面的 Renderer2 类的方式:

r = 新渲染器();环形:渲染器.bind();对于很多很多的物体...Renderer.render(x1, x2, y1, y2, 顶部颜色, 底部颜色); ...渲染器.flush();中断循环;

public class Renderer2
{
private util.ShaderProgram shaderProgram;

private int vaoID;
private int vboVertID;
private int eboID;

FloatBuffer vboBuff;

private final int floatsPerQuad = 6;
private int nrOfVert = 0;


public Renderer2(){
String VERTEX = "#version 330 core" + "\n"
+ "layout(location = 0) in vec2 position;" + "\n"
+ "layout(location = 1) in vec4 color;" + "\n"
+ "out vec4 vColor;" + "\n"
+ "void main(){" + "\n"
+ "vColor = color;" + "\n"
+ "gl_Position = vec4(position, 0.0, 1.0);" + "\n"
+ "}";

String FRAGMENT = "#version 330 core" + "\n"
+ "in vec4 vColor;" + "\n"
+ "out vec4 fragColor;" + "\n"
+ "void main(){" + "\n"
+ "fragColor = vColor;" + "\n"
+ "}";

shaderProgram = new ShaderProgram();
shaderProgram.attachVertexShader(VERTEX);
shaderProgram.attachFragmentShader(FRAGMENT);
shaderProgram.link();

vboBuff = BufferUtils.createFloatBuffer(25000);

// Generate and bind a Vertex Array
vaoID = glGenVertexArrays();
glBindVertexArray(vaoID);

// The indices that form the rectangle
short[] indices = new short[]
{
0, 1, 2, // The indices for the left triangle
1, 2, 3 // The indices for the right triangle
};

// Create a Buffer Object and upload the vertices buffer
vboVertID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertID);

// Point the buffer at location 0, the location we set
// inside the vertex shader. You can use any location
// but the locations should match
glVertexAttribPointer(0, 2, GL_FLOAT, false, 24, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, false, 24, 8);
// Create a Buffer Object and upload the colors buffer

// Create a ShortBuffer of indices
ShortBuffer indicesBuffer = BufferUtils.createShortBuffer(indices.length);
indicesBuffer.put(indices).flip();

// Create the Element Buffer object
eboID = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);

// Enable the vertex attribute locations
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

glBindVertexArray(0);
}

public void bind(){
vboBuff.clear();
glBindVertexArray(vaoID);
shaderProgram.bind();
nrOfVert = 0;
}

public void render(float x1, float x2, float y1, float y2, Color top, Color bottom){

vboBuff.put(x1).put(y1);
vboBuff.put(top.r).put(top.g).put(top.b).put(top.a);
vboBuff.put(x2).put(y1);
vboBuff.put(top.r).put(top.g).put(top.b).put(top.a);
vboBuff.put(x1).put(y2);
vboBuff.put(bottom.r).put(bottom.g).put(bottom.b).put(bottom.a);
vboBuff.put(x2).put(y2);
vboBuff.put(bottom.r).put(bottom.g).put(bottom.b).put(bottom.a);

nrOfVert += floatsPerQuad;
}

public void flush(){

vboBuff.flip();

glBindBuffer(GL_ARRAY_BUFFER, vboVertID);

glBufferData(GL_ARRAY_BUFFER, vboBuff, GL_DYNAMIC_DRAW);

glDrawElements(GL_TRIANGLES, nrOfVert, GL_UNSIGNED_SHORT, 0);

glBindVertexArray(0);
ShaderProgram.unbind();
}

public void dispose()
{
// Dispose the program
shaderProgram.dispose();

// Dispose the vertex array
glBindVertexArray(0);
glDeleteVertexArrays(vaoID);

// Dispose the buffer object
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(vboVertID);

// Dispose the element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDeleteBuffers(eboID);
}

}

最佳答案

既然您已经在评论部分找到了答案,现在正在询问创建一个巨大的索引缓冲区并保持其静态是否有效:

如果数据不会改变,你应该用 GL_STATIC_DRAW 声明你的数组缓冲区。 GL_DYNAMIC_DRAW 向 GPU 暗示您将不断更改缓冲区数据,这使得驱动程序以不同的方式处理您的数据。

如果您真的担心性能,我建议您考虑不同的渲染方法,例如您正在渲染的四边形是否相同或仅因颜色或其他内容而变化。看看这个OpenGL Best Practices并尝试一些方法。

关于java - opengl 3.2 drawElements,只有一个四边形可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29769287/

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