关于 glMapBufferRange

Posted

技术标签:

【中文标题】关于 glMapBufferRange【英文标题】:Regarding glMapBufferRange 【发布时间】:2013-01-21 17:25:09 【问题描述】:
    GLfloat vertices4[]=-0.9,0.6, -0.9,0.2, -0.6,0.2, -0.6,0.6,
                         -0.4,0.6, -0.4,0.2,  0.1,0.2,  0.1,0.6,
                          0.3,0.6,  0.3,0.2,  0.6,0.2,  0.6,0.6  ;

     GLushort indices[]=0,1,2,3, 120, 4,5,6,7, 120, 8,9,10,11;
     GLenum *value=GL_STREAM_DRAW;  
     GLfloat temp_err;

     glEnable(GL_PRIMITIVE_RESTART);
     nResult =GL_ERROR_CHECK((GL_NO_ERROR,"glEnable(GL_PRIMITIVE_RESTART)"));

     glPrimitiveRestartIndex(120);
     nResult = GL_ERROR_CHECK((GL_NO_ERROR,"glPrimitiveRestartIndex(120);"));

     glGenBuffers(1,&bufferid1);
     nResult = GL_ERROR_CHECK((GL_NO_ERROR,"glGenBuffers(1,&bufferid1)"));

     glGenBuffers(1,bufferid);

     glBindBuffer(GL_TEXTURE_BUFFER,bufferid);      
     glBufferData(GL_TEXTURE_BUFFER,sizeof(vertices4),vertices4,*value);

     temp_err=(GLfloat*)glMapBufferRange(GL_TEXTURE_BUFFER,0,8*sizeof(GLfloat),GL_MAP_READ_BIT);


     glBindBuffer(GL_ARRAY_BUFFER,bufferid1);
     nResult = GL_ERROR_CHECK((GL_NO_ERROR,"glBindBuffer(GL_ARRAY_BUFFER,bufferid1);")); 

     glBufferData(GL_ARRAY_BUFFER,8*sizeof(GLfloat),temp_err,*value);


     *attr_vertex = glGetAttribLocation(shader_data.psId, "a_position"); 
     nResult = GL_ERROR_CHECK((GL_NO_ERROR,"glGetAttribLocation(shader_data.psId, \"a_position\");"));

     glVertexAttribPointer(*attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0, 0);
     nResult = GL_ERROR_CHECK((GL_NO_ERROR,"glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0, 0);"));

     glEnableVertexAttribArray(*attr_vertex);
     nResult = GL_ERROR_CHECK((GL_NO_ERROR,"glEnableVertexAttribArray(attr_vertex);"));

     glUniform1f(glGetUniformLocation(shader_data.psId,"offset_x"),x);                      
     glUniform1f(glGetUniformLocation(shader_data.psId,"offset_y"),y);                      
     glDrawElements(GL_TRIANGLE_FAN, 14,GL_UNSIGNED_SHORT,indices);

我希望它会渲染 1 个四边形,因为我正在为“bufferid1”中的第一个四边形传递顶点数据,但它会渲染 vertices4 中的所有 3 个四边形。请指出我哪里出错了。

【问题讨论】:

【参考方案1】:

我希望它会呈现 1 个四边形

你怎么能期待呢?您的渲染调用具体表示要渲染 14 个顶点:

glDrawElements(GL_TRIANGLE_FAN, 14,GL_UNSIGNED_SHORT,indices);

OpenGL 没有理由神奇地知道你这次只指四个。

【讨论】:

但我正在为缓冲区中的 1 个四边形提供顶点数据。实际上,相同的代码使用 ATI 和 nvidia 卡呈现 1 个四边形,但它在 IMG 驱动程序上呈现 3 个四边形。 @Roshan:缓冲区有多大并不重要;你说14个顶点。因此,OpenGL 将尝试渲染您要求的内容。由于这意味着采样超出缓冲区的大小,这意味着 未定义的行为

以上是关于关于 glMapBufferRange的主要内容,如果未能解决你的问题,请参考以下文章

scrapy 关于 rule, 关于多页

JS学习笔记关于选项卡,关于this,关于innerHTML

关于唯典冰淇淋新闻页的布局

关于prototype.js的一些技术说明

主页链接发送到关于/关于页面无法回家

关于写作