- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑:我应该澄清一下......
这就是我计划的工作方式:
每次我的应用程序渲染(60hz)时,我都想将所有要渲染的顶点放入一个巨大的缓冲区中。然后,该缓冲区将上传到 GPU。 (glBufferdata)。
然后我将使用 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/
在我的程序中,我基本上将所有对象放在一个缓冲区中,现在当我想绘制多个对象时遇到问题,如果我只绘制一个它仍然有效。 当我粗略地将所有 glDrawArrays 更改为 glDrawElements 调用
我正在制作一个小型的 2D 游戏演示,从我读过的内容来看,最好使用 drawElements()绘制索引三角形列表而不是使用 drawArrays()绘制一个无索引的三角形列表。 但据我所知,使用 d
我正在尝试学习 WebGL,所以我从 webgl 教程中获取了一些代码,并尝试添加我自己的行,但是每当我运行它时,它都会给我这个错误: .WebGLRenderingContext: GL ERROR
我的问题是:为什么相同的示例 WebGL 代码会在不同平台/浏览器上产生不同的输出? 在 Windows 上的 Firefox 30.0(以及最新的 32)中,但在 Mac 上则不然,在渲染点时进行多
在绘制之前清除屏幕时,RenderingContext.drawElements 是否正确? 考虑这些屏幕截图,这些屏幕截图显示了调用 drawElements 的一个步骤,其中已绘制的对象被删除。
这样的OpenGL ES序列可用于一次渲染多个对象: glVertexPointer(...params..., vertex_Array ); glTexCoordPointer(...params
提前谢谢你。 我是 Webgl 的新手,我不太了解 drawElements 方法和我要绘制的当前顶点缓冲区之间的联系。我大致了解 drawArray 方法发生了什么(例如创建缓冲区,将其绑定(bin
这是一个相当特定于 WebGL 的问题。我无法理解 drawElements 的特定于 WebGL 的实现。这是 API 规范。 From the WebGL specification . 我究竟如
现在我正在按照 Jamie King Qt OpenGL 教程学习 OpenGL。 (他们很好)。 在其中一个教程中,我遵循它但无法使用 DrawElemets 绘制两个顶点缓冲区三角形。它适用于 G
编辑:我应该澄清一下...... 这就是我计划的工作方式: 每次我的应用程序渲染(60hz)时,我都想将所有要渲染的顶点放入一个巨大的缓冲区中。然后,该缓冲区将上传到 GPU。 (glBufferda
今天下午,当我从使用 VBO 转向 VAO/VBO 时,我一直在努力说服我的 openGLES2.0 代码正确执行。基本上,我正在按照 Apple 关于 openGLES 的“专家”建议进行工作,并转
我想从 model.json 文件中绘制一个 3d 模型(例如房子)。我用蓝色等单一颜色绘制房子没有问题。但是,当我尝试使用纹理而不是颜色时,我收到一个错误: WebGL: DrawElements:
我目前正在学习 android 开发以编写基于图 block 的游戏,但我无法让 OpenGLES 正常工作。 所以我尝试使用索引数组渲染四边形,但它只渲染了四边形的第一个三角形,第二个三角形丢失了,
我正在尝试绘制一个简单的三角形数组。它们都是相连的,所以我目前正在使用 DrawArrays 和 GL_TRIANGLE_STRIP。但是,在检查 XCode 分析器时,它建议改用 DrawEleme
本文整理了Java中com.google.gwt.webgl.client.WebGLRenderingContext.drawElements()方法的一些代码示例,展示了WebGLRenderin
所以,我开始了一段相当即时的视觉化 3-D 编程世界之旅。我目前在 webgl 上投入了大量资金,在 JavaScript 和大多数面向 Web 的语言方面有很强的背景,但这是我的第一种图形语言。 在
我实现了简单的 OBJ 解析器并使用平行六面体作为示例模型。我添加了基于四元数的旋转功能。下一个目标 - 添加光。我解析法线并决定将法线绘制为“调试”功能(以进一步更好地理解光)。但在那之后我坚持了下
大家好,我这几天一直在学习 webgl。 有两个片段可以完成相同的事情 - 绘制一个正方形。一种是对 6 个顶点使用 gl.drawArrays,一种是对 4 个顶点使用 gl.drawElement
我是一名优秀的程序员,十分优秀!