我必须在每一帧上只上传特定元素(数千个)的顶点数组 - 或者在第一个和最后一个更改的值之间的整个区域上传,但由于它有可能重新上传整个数组,因此效率非常低,无论如何,将上传许多未更改的值.
问题还包括将顶点数据上传到GPU的最快方法.
有几种方法可以做到:
glBufferData() / glBufferSubData() // Standard upload to buffer
glBufferData() // glBufferData with double buffer
glMapBuffer() // Mapping video memory
cudaMemcpy() // CUDA memcopy from host to device vertex buffer
Run Code Online (Sandbox Code Playgroud)
哪个会是最快的?我特别关注CUDA方式,这与标准OpenGL方法有所不同.它比glBufferData()还是glMapBuffer()更快?
我编写以下简单代码来学习如何使用vbo,但没有出现任何内容:
GLuint vbo=0;
GLfloat data[] = {175.0, 25.0, 0.0, 1.0, 0.0, 0.0, 100.0, 325.0, 0.0, 0.0,1.0,0.0,
250.0, 25.0, 0.0, 0.0, 0.0, 1.0};
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data),data, GL_STATIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, (void*)(3*sizeof(float)) );
glDrawArrays(GL_TRIANGLES, 0,3);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glutSwapBuffers();
glFlush();
}
void reshape(int w, int h){
glClearColor(0.5,0.2,0.5,1);
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, (GLsizei) w, 0, (GLsizei) h, -1,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int …Run Code Online (Sandbox Code Playgroud) 我想发送一个缓冲区列表(到GPU /顶点着色器),其中包含有关顶点位置,世界位置,颜色,比例和旋转的信息.
如果我的每个3D对象都有一个矩阵中的变换相关信息,我怎样才能通过VBO将这个矩阵数组(除了其他顶点数据)传递给GPU?
更新 请原谅任何错别字:
// bind & set vertices.
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAtribPointer(a_Position, 3, gl.FLOAT, false, stride, 0);
// bind & set vertex normals.
gl.bindBuffer(gl.ARRAY_BUFFER,, vertexNormalsBuffer);
gl.vertexAttribPointer(a_Normal, 3, gl.FLOAT, false, stride, 0);
// becaue i cant pass in a model matrix via VBO, im tryng to pass in my world coordinates.
gl.bindBuffer(gl.ARRAY_BUFFER, worldPositionBuffer);
// not sure why i need to do this, but most tutorials i've read says to do this.
gl.bindBuffer(gl.ARRAY_BUFFER, null);
// bind & draw index buffer.
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, …Run Code Online (Sandbox Code Playgroud) 所以我一直在https://open.gl/上学习OpenGL 3.3 ,我对一些东西感到很困惑.
glVertexAttribPointer呼叫.最重要的是这一切如何适合大型项目?究竟是什么用于VAO-s?大多数教程只是为了绘制一个立方体或2个带有硬编码顶点的东西,那么如何管理具有大量对象的场景呢?我已经阅读了这个帖子并且对场景管理的发生方式有了一些了解,但我仍然无法弄清楚如何将OpenGL的东西连接到它.
我正在开发基于3D平铺的策略游戏,并且已经读过实现VBO将显着提高游戏的帧速率并降低CPU使用率(听起来不错吧?).但是,在我看过的教程中,我无法理解如何实现它.有没有人有这方面的经验,可以指向一个可靠的来源或提供实际工作的示例代码?谢谢!
使用SDL 1.2时,我需要包含什么才能使用OpenGL 顶点缓冲对象(VBO)?
目前,我只包括 SDL.h, SDL_opengl.h, SDL_image.h
并得到错误:
glGenBuffersARB, glBindBufferARB, glBufferDataARB not declared in this scope
我有很多对象,但我想要其中一个对象(鼠标悬停在其上)以"发光"(快速改变颜色).
因此,一种方法是让每个对象都有自己的VBO.我不会有彩色阵列.然后我会喜欢,一千个VBO,每个都有大约20个四边形...如果它是选定的对象,我会在它之前调用glColor3f(blah,blah,blah),否则它将是默认颜色.
另一种方法是将它们全部放在一个大的VBO中.我将有一个彩色阵列.然后我会非常频繁地将glBufferSubDataARB做成颜色数组,以使一个对象发光.
哪种方式更好,为什么?如果两种方式都不好,还建议另一种方式.
我试图用OpenGL ES 2.0 GLKit绘制一条线.当我运行以下代码并使用OpenGL ES Analyzer时,我收到以下错误:
"使用不存在的程序"glDrawArrays(GL_LINE_STRIP,0,4)
"GL错误:无效操作"GL_INVALID_OPERATION < - glVertexPointer(2,GL_FLOAT,0,NULL)GL_INVALID_OPERATION < - glEnableClientState(GL_VERTEX_ARRAY)
这是我的代码:
#import "GLDrawingView.h"
const float data[] = {0.0f, 1.0f, 0.0f, 0.0f, 1.0f, -0.0f, 0.0f, 1.0f};
@interface GLDrawingView () {
GLuint lineVBO;
}
@end
@implementation GLDrawingView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[EAGLContext setCurrentContext:self.context];
glGenBuffers(1, &lineVBO);
glBindBuffer(GL_ARRAY_BUFFER, lineVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
}
return self;
}
- (void)drawRect:(CGRect)rect
{
glVertexPointer(2, GL_FLOAT, 0, NULL);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINE_STRIP, 0, sizeof(data) / sizeof(float) / 2);
}
@end
Run Code Online (Sandbox Code Playgroud) 我有一个与OpenGL相关的问题.每当我尝试使用顶点缓冲区中的四个顶点绘制一个简单的多边形时......没有任何反应.但是,它会以GL_TRIANGLES或GL_TRIANGLE_STRIP模式绘制形状,尽管是扭曲的.难道我做错了什么?
相关代码:
顶点阵列:http://i.imgur.com/nEcbw.png
GL_POLYGON:http://i.imgur.com/idfFT.png
GL_TRIANGLES:http://imgur.com/84ey3,idfFT,nEcbw#0
GL_TRIANGLE_STRIP:http://i.imgur.com/JU3Zl.png
我试图了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形
const GLfloat rect[] = {
-0.5f, 0.5f,
0.5f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f};
const GLfloat tri[] = {
0.0f, 1.0f,
0.5f, 0.5f,
-0.5f, 0.5f};
Run Code Online (Sandbox Code Playgroud)
我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前 3 个属性来自三角形,接下来的 2 个属性来自矩形的最后 2 个点。然后我把它们画成三角形条。
GLuint vbo[2];
glGenBuffers(2, vbo);
GLuint varr;
glGenVertexArrays(1, &varr);
glBindVertexArray(varr);
// draw triangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(tri), tri, 0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// draw rectangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(rect), rect, 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(3);
glDrawArrays(GL_TRIANGLE_STRIP, …Run Code Online (Sandbox Code Playgroud) 我有一个顶点缓冲区创建如下:
ID3D10Buffer * VertexBuffer;
Vertex_PosCol * Vertices;
D3D10_SUBRESOURCE_DATA VertexData;
Vertices = new Vertex_PosCol[VerticeCount];
Vertices[0].Position = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Vertices[0].Color = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f);
Vertices[1].Position = D3DXVECTOR3(-1.0f, 2.0f, 0.0f);
Vertices[1].Color = D3DXVECTOR4(1.0f, 0.0f, 0.0f, 1.0f);
Vertices[2].Position = D3DXVECTOR3(1.0f, 2.0f, 0.0f);
Vertices[2].Color = D3DXVECTOR4(0.0f, 1.0f, 0.0f, 1.0f);
Vertices[3].Position = D3DXVECTOR3(2.0f, 1.0f, 0.0f);
Vertices[3].Color = D3DXVECTOR4(0.0f, 0.0f, 1.0f, 1.0f);
Vertices[4].Position = D3DXVECTOR3(2.0f, -1.0f, 0.0f);
Vertices[4].Color = D3DXVECTOR4(1.0f, 1.0f, 0.0f, 1.0f);
Vertices[5].Position = D3DXVECTOR3(1.0f, -2.0f, 0.0f);
Vertices[5].Color = D3DXVECTOR4(0.0f, 1.0f, 1.0f, 1.0f);
Vertices[6].Position …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,将两个网格的顶点(用作关键帧)加载到两个单独的OpenGL浮点数据缓冲区中.两个网格具有相同数量的顶点.
我想通过在这两个缓冲区之间使用线性插值来计算中间帧(我可以将插值加权指定为0到1之间的值).我目前正在CPU上执行插值,但我想将计算卸载到GPU以便更快地计算中间帧.
有没有办法只使用OpenGL(即不是OpenCL)?如果是这样,怎么样?