- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个模型,我想用 glMultiDrawElements 渲染。准备数据并使用简单的 vector 渲染它工作正常,但当我使用顶点缓冲区时失败。显然我在计算缓冲区偏移量时犯了某种错误。首先是工作代码:
我的第一步是准备数据供以后使用(包含伪代码以使其更易于阅读):
for(each face in the model){
const Face &f = *face;
drawSizes.push_back(3);
for(int i=0;i<f.numberVertices;++i){
const Vertex &v = vertices[f.vertices[i]]]; // points to vertex array
vertexArray.push_back(v.x);
indexArray.push_back(vertexArray.size() - 1);
vertexArray.push_back(v.y);
indexArray.push_back(vertexArray.size() - 1);
vertexArray.push_back(v.z);
indexArray.push_back(vertexArray.size() - 1);
normalArray.push_back(f.normalx);
normalArray.push_back(f.normaly);
normalArray.push_back(f.normalz);
}
}
int counter = 0;
for(each face in the model){
vertexIndexStart.push_back(&indexArray[counter*3]);
offsetIndexArray.push_back(static_cast<void*>(0) + counter*3);
counter++;
}
drawSizes is a vector<Glint>
vertexArray is a vector<GLfloat>
indexArray is a vector<GLint>
vertexIndexStart is a vector<Glvoid *>
offsetIndexArray is a vector<GLvoid *>
我现在用 glMultiDrawElements 函数按以下方式绘制它:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),&vertexArray[0]);
glNormalPointer(GL_FLOAT,0,&normalArray[0]);
glMultiDrawElements(GL_POLYGON,&drawSizes[0],GL_UNSIGNED_INT,&vertexIndexStart[0],vertexIndexStart.size());
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
它会按应有的方式绘制模型,尽管性能并不比即时模式好多少。
当我现在尝试缓冲创建的数据并使用缓冲区渲染模型时,它显然不起作用。在第一步中,我再次预处理已经处理过的数据:
glGenBuffers(2,buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertexArray),&vertexArray[0],GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexArray),&indexArray[0],GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
buffers is a GLuint[]
然后我尝试渲染数据:
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),0);
glMultiDrawElements(GL_POLYGON,&drawSizes[0],GL_UNSIGNED_INT,&offsetIndexArray[0],vertexIndexStart.size());
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
glDisableClientState(GL_VERTEX_ARRAY);
这会导致一个空屏幕。有什么想法吗?
编辑:我现在按照建议使用正确的索引,但我仍然没有得到想要的结果。
最佳答案
这是错误的:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertexIndexStart),&vertexIndexStart[0],GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
元素数组缓冲区应该包含索引数组,这意味着顶点数组中的索引,而不是索引数组中的索引。
另请注意,您的代码使用了许多已弃用的 GL 功能(内置属性,甚至可能是固定功能管道,没有 VAO 的绘图),并且无法在现代 OpenGL 的核心配置文件中工作。
谈到现代 GL:进一步的间接级别,其中 glMultiDrawElements
的参数数组本身来自缓冲区对象,现代 GL 甚至通过 glMultiDrawElemetnsIndirect
支持它。 .
关于c++ - glMultiDrawElements VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40342111/
背景故事:我正在尝试使用单个绘制调用在屏幕上绘制尽可能多的正方形。我正在使用专门用于 2D 绘图的自定义 glsl 顶点着色器,它应该是从 samplerBuffer 中提取正方形顶点的位置数据。因为
我有一个模型,我想用 glMultiDrawElements 渲染。准备数据并使用简单的 vector 渲染它工作正常,但当我使用顶点缓冲区时失败。显然我在计算缓冲区偏移量时犯了某种错误。首先是工作代
我在很多网站上都读到过 glMultiDrawElements是“相当于”这样做: for(int i = 0; i < drawCount; ++i){ glDrawElements(mod
我最近从 32 位环境迁移到 64 位环境,除了一个问题外一切顺利:glMultiDrawElements 使用一些数组,如果不在 64 位操作系统下进行一些调整,这些数组将无法工作。 glMulti
我使用 OpenGL 和 GLSL 开发了一个小型 3D 引擎。 我已经合并了一个顶点数据批处理系统,其目标是收集所有几何图形(所有对象)共享相同的着色器程序和相同的变换在一个唯一的顶点缓冲区对象(V
我真的很难为这个问题想出一个好的标题,所以如果你能想出一个好的标题,请提出一个新标题。或许我们可以在解决我的问题后这样做......现在开始: 我目前正在移植代码以使用 glMultiDrawElem
ffunction glMultiDrawElements 需要一个指向指针的指针作为其参数之一。如何从 StorableArray Int a 获取 Ptr(Ptr a) ? 最佳答案 您需要先将索
我是一名优秀的程序员,十分优秀!