0

現在、問題なく使用して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;
}
4

0 に答える 0