現在、問題なく使用してVBOからレンダリングしている要素がたくさんありglDrawArrays
ます。
ただし、IBOを追加すると、それを使用するレンダリングコードがなくても、でクラッシュしましたglDrawArrays
。
すべてのglBindBuffer呼び出しを10回以上チェックしましたが、問題はありません。しかし、それはIBOのサイズに関係しています。glDrawArraysでクラッシュをトリガーする追加のコードは次のとおりです。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, NULL, GL_STREAM_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
がsize
約5kbを超えると、クラッシュが発生し始めます。クラッシュは一貫していますが、レンダリングしている要素によって異なります。たとえば、6kbではすぐにはクラッシュしませんが、最初に非表示になっている別のUI要素をプルダウンすると、レンダリング中にクラッシュします。8kb前後に設定すると、。を使用して最初の要素で常にすぐにクラッシュしglDrawArrays
ます。
私の予感は、クラッシュの可能性とglBufferData
の相関関係を考えると、呼び出しがどこかでメモリを破壊size
しているということですが、私が間違っていることを理解することはできません。
公式のnVidiaドライバーを使用してx64Linuxで実行しています。
編集:これがglDrawArraysコードです:
cgGLBindProgram(program);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
cgGLEnableClientState(verts);
cgGLSetParameterPointer(verts, vertSize, GL_FLOAT, stride, reinterpret_cast<void*>(vertoffset);
gGLEnableClientState(texcoords);
cgGLSetParameterPointer(texcoords, tcSize, GL_FLOAT, tcstride, reinterpret_cast<void*>(tcoffset);
cgSetMatrixParameterfc(matrix, (*m)[0]); // ortho matrix
cgGLSetParameter4f(color, f1, f2, f3, f4);
cgGLBindProgram(fragmentProgram);
cgGLSetTextureParameter(texture, tex->getID());
cgGLEnableTextureParameter(texture);
glDrawArrays(GL_QUADS, first, vertCount);
使用したシェーダー:
output ortho(float2 position : POSITION, float2 texCoord : TEXCOORD0, uniform float4 color : COLOR, uniform float4x4 ortho_proj) {
output OUT;
OUT.position = mul(float4(position, 0, 1), ortho_proj);
OUT.color = color;
OUT.texCoord = texCoord;
return OUT;
}
void textured(float4 color : COLOR, float2 texCoord : TEXCOORD0, out float4 outColor, uniform sampler2D texture) {
outColor = tex2D(texture, texCoord) * color;
}