0

glVertexAttribPointer の最後の属性は const GLvoid* 型です。しかし、それは本当にポインタですか?実はオフセットです。0 を指定すると、オフセットへの null ポインターではなく、0 のオフセットを意味します。私のエンジンでは、次の関数を使用します。

void AbstractVertexData::vertexAttribPtr(int layout) const
{
    glVertexAttribPointer(layout,
                          getShaderAttribs()[layout]->nbComponents,
                          static_cast<GLenum>(getShaderAttribs()[layout]->attribDataType),
                          getShaderAttribs()[layout]->shouldNormalize,
                          getVertexStride(layout),
                          reinterpret_cast<const void*>(getVertexAttribStart(layout)));
}

getVertexAttribStart は intptr_t を返します。drmemory を実行すると、「未初期化読み取り」と表示され、その警告を削除したいと考えています。この警告は、reinterpret_cast から発生します。私の値はポインターではないので、 const void* に static_cast することはできません。この警告を修正するにはどうすればよいですか?

4

1 に答える 1

1

もともと、頂点配列が導入された OpenGL-1.1 では、 などの関数glVertexPointerglTexCoordPointerクライアント アドレス空間へのポインターを受け入れていました。シェーダーが導入されたとき、シェーダーには任意の頂点属性が付属しており、関数glVertexAttribPointerは同じセマンティクスに従います (これは OpenGL-2.1 にありました)。

バッファー オブジェクト API は、ポインター パラメーターに整数を渡す既存の関数を再利用していました。

void*OpenGL-3.3 コアは、最終的にバッファ オブジェクトの使用を必須にしました。関数シグネチャで定義されている glVertexAttribPointer 関数が痛いところです。https://stackoverflow.com/a/8284829/524368でそれについて詳しく書いています(ただし、残りの回答も必ず読んでください)。

最終的に、頂点属性へのアクセス方法をよりきめ細かく制御できる新しい関数が導入され、glV​​ertexAttribPointer が置き換えられました。これらは純粋にオフセットで動作します。

于 2015-03-22T10:54:27.180 に答える