0

わかりましたので、独自の glwrapper を使用してすべての OpenGL 関数を正常にフックしました。私が抱えている問題は、Intel/Nvidia と ATI の関係です。モデルをフックし、各モデルの ID を生成して、何がレンダリングされているかを確認できるようにしています。

以下は、私が現在持っている情報と違いです。

glPushMatrix()

glMultMatrixf({0.70710671, 0, 0.70710683, 0}
{0, 1, 0, 0}
{-0.70710683, 0, 0.70710671, 0}
{26368, -1125, 28416, 1})

glBindBufferARB(GL_ARRAY_BUFFER, 56)
glBufferSubDataARB(GL_ARRAY_BUFFER, 0, 11544, 0x0B2DF6EC)
glGenBuffersARB(1, 0x0AE6231C)
glBindBufferARB(GL_ARRAY_BUFFER, 65)
glBufferDataARB(GL_ARRAY_BUFFER, 11544, 0x0B2DF6EC, GL_STATIC_DRAW)   
glGenBuffersARB(1, 0x0AE6231C)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 66)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, 7020, 0x0B2DF6EC, GL_STATIC_DRAW)

//上記のすべては、両方のグラフィックス カードによって実行されます。以下、問題の出番です。

glBindBufferARB(GL_ARRAY_BUFFER, 56)         //Intel/Nvidia makes this NULL.
glVertexPointer(3, GL_FLOAT, 12, 0x00000000) //Intel/NVidia makes this Not 0x00000.
glEnableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER, 65)
glColorPointer(4, GL_UNSIGNED_BYTE, 12, 0x00000000)
glEnableClientState(GL_COLOR_ARRAY)
glTexCoordPointer(2, GL_FLOAT, 12, 0x00000004)
glEnableClientState(GL_TEXTURE_COORD_ARRAY)
glDrawElements(GL_TRIANGLES, 3510, GL_UNSIGNED_SHORT, 0x00000000)

ATIではすべてが上記のようになっているのに、bindbuffer呼び出しをNULLにして、NvidiaおよびIntelカードの頂点ポインターをnullにしない理由を知りたいです。

違いは何ですか?また、私の 2 番目の質問は、頂点とインデックスへのポインターを保存した場合 (それらが削除されないことを保証します)、各頂点を取得するにはどうすればよいですか?

例:

VBO CurrentBuffer;
std::vector<VBO> Buffers;

Hook_glBufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)
{
    CurrentBuffer.target = target;
    CurrentBuffer.size = size;
    CurrentBuffer.usage = usage;     //To figure out if it's indices array or vertex array.
    CurrentBuffer.data = data;       //Let us assume that this pointer is never deleted.

    (*original_BufferDataArb)(target, size, data, usage);
}

Hook_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
    CurrentBuffer.VNull = (pointer == NULL) ? true : false;
    CurrentBuffer.VPointer = pointer;  //This can be both null or not null.
    CurrentBuffer.VSize = size;
    CurrentBuffer.Vtype = type;
    CurrentBuffer.Stride = stride;
    Buffers.push_back(CurrentBuffer);

    (*original_VPointer)(size, type, stride, pointer);
}


void Hook_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
{
    if (mode == GL_TRIANGLES)
    {
        const GLfloat* Pointer = static_cast<const GLfloat*>(Buffers.back().VPointer);  //Assuming it isn't NULL.
        for (int I = 0; I < count / 3; ++I)  //For each triangle.
        {
            int X = *(reinterpret_cast<const GLfloat*>(reinterpret_cast<const char*>(Pointer)));
            int Y = *(reinterpret_cast<const GLfloat*>(reinterpret_cast<const char*>(Pointer) + (Buffers.back().Stride)) + 1);
            int Z = *(reinterpret_cast<const GLfloat*>(reinterpret_cast<const char*>(Pointer) + (2 * Buffers.back().Stride)) + 2);
        }
    }

    (*original_DrawElements)(mode, count, type, indices);
}

ポインターを適切に反復していますか? また、頂点ポインターが null の場合、bufferdata を使用して各頂点を取得する方法はありますか? 私ができることを読みました:

if (CurrentBuffer.VNull)
{
    GLfloat* IndexPointer = Buffers[Buffers.size()].data;      //Index pointer is GL_Element_Array_Buffer
    GLfloat* VertexPointer = Buffers[Buffers.size() - 1].data; //Vertex pointer is GL_Array_Buffer

    for (int I = 0; I < TriangleCount; ++I)
    {
        int X = *VertexPointer[IndexPointer[I]];
        int Y = *VertexPointer[IndexPointer[I]] + 1;
        int Z = *VertexPointer[IndexPointer[I]] + 2;
    }
}
4

1 に答える 1

1
glBindBufferARB(GL_ARRAY_BUFFER, 56)         //Intel/Nvidia makes this NULL.
glVertexPointer(3, GL_FLOAT, 12, 0x00000000) //Intel/NVidia makes this Not 0x00000.

Intel/NVidia の場合、プログラムがこれらの値を積極的に設定していないことは確かですか。glVertexPointer へのデータ パラメータとしての null 値は、バッファ オブジェクトがバインドされている場合にのみ意味があります。ただし、ID 0 の glBindBuffer 呼び出しを使用してバインドを解除するなどして、バッファー オブジェクトがバインドされていない場合、glVertexPointer へのデータ パラメーターは null 以外のポインターでなければなりません。

于 2012-08-23T15:37:20.960 に答える