gig*_*gle 9 opengl graphics ati
各位,我试图在我的OpenGL实例绘图中使用glVertexAttribDivisor.
它适用于NV卡,但在ATI卡中不起作用.什么都没画.
从GlExtensionViewer,它显示这两个卡都支持glVertexAttribDivisor/InstancedStream.跑步时没有错误.
我不知道这是否是由于我的错误用法造成的.
我将实例数据放在一个单独的顶点数组缓冲区中,然后将其映射到gl_MultiTexCoord0~3.实例数据是世界矩阵.
代码就在这里.
for( int i=0;i<3;i++)
{
glClientActiveTexture(kGL_TEXTURE0 + i);
glTexCoordPointer(size, type, stride, i*4*sizeof(float));
int instanceVertexAttribIndex = i + 8;
glVertexAttribDivisorARB(instanceVertexAttribIndex, 1);
}
Run Code Online (Sandbox Code Playgroud)
关键问题是如果我尝试将实例数据放在gl_MultiTexCoord0上,我应该给glVertexAttribDivisorARB正确的"索引"?
Nic*_*las 13
它适用于NVIDIA显卡,因为NVIDIA没有正确实现OpenGL规范.
glVertexAttrbDivisorARB仅适用于通用属性.也就是说,用户定义的着色器属性.它并不能在比由规定的其他任何属性的工作glVertexAttrib(I)Pointer.
NVIDIA长期以来实现了属性别名的行为.这gl_MultiTexCoorc[0]还具有属性索引8.即gl_Vertex,顶点位置输入,具有属性索引0.
问题?OpenGL规范不允许这样做.它特别要求实现失败并在您尝试时给出错误.当你glDraw*设置这些数组调用时,你的实现应该给你一个错误.
可悲的是,你陷入了NVIDIA陷阱:使用非规范行为,这恰好恰好影响了他们的驱动程序.我想你一定是从一些NVIDIA论文中得到了这个想法.因此,现在您必须更改所有代码以使用用户定义的属性而不是内置属性.
哦,如果你想知道它在说明书中的哪个位置,请参阅OpenGL 3.3兼容性配置文件,第94页,最底层:
通用属性不可能与常规属性别名.
| 归档时间: |
|
| 查看次数: |
2212 次 |
| 最近记录: |