2

更新: 複数のテクスチャを描画できるようになりました。glGenTextures などがどのように機能するかを理解し、loadtextures () 関数などを書き直しました。ただし、車の一部しか描かれていません。ステアリング ホイール、ハブ キャップ 1 つ、バック ライト (およびいくつかの小さいもの)。collada ファイルでは、テクスチャ ファイルに関連付けられていないマテリアルがいくつかあります。これは問題ではないと思います。なぜなら、最初にリスト内のテクスチャを最初の 2 つのポリリスト (5 つ、合計 80 ほどあります) に関連付けたからです。適切なテクスチャ、タイヤが欠けているだけ、そして気付かなかった小さなことかもしれません。タイル張りのテクスチャと関係があるのではないでしょうか?とにかく、テクスチャ ファイルを持たないすべてのメッシュを赤色に置き換えたかったのですが、その方法がわかりません。

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-4-a-colored-cube/

カラー バッファを作成したり、バインドしたりしましたが、シェーダ ファイルを編集する必要があることに気付きましたが、その方法がわかりません。

1:

attribute vec3 vPosition;
attribute vec2 vTextureCoord;
varying  vec2 vTexCoord; 
uniform  mat4 modelview_matrix;

void main(void)  
{     
   vTexCoord =  vTextureCoord;
   gl_Position =  modelview_matrix*vec4(vPosition,1.0);
}

その他:

varying  vec2 vTexCoord; 
uniform sampler2D myTexture;
void main (void)  
{  
   gl_FragColor =  texture2D(myTexture, vTexCoord);     
}

/////元の質問

テクスチャを使用していくつかのオブジェクトを描画する必要があるユニ割り当てを行っています (シーンなどを移動できるようにする必要がありますが、到達したらその橋を渡ります)。単一の頂点配列と .obj ファイルから単一のテクスチャ ファイルからオブジェクトを描画するベースとしてチュートリアルがあります (前のチュートリアルのパーサーを作成しました)。

割り当ては collada ファイルを使用するため、collada パーサーを作成しました。本当に大変でした!私の collada パーサーは、多数の name 変数と id 変数 (main.cpp では使用されません。collada ファイルのパーツ間で関連付けを行うためだけのものです) を持つマテリアル オブジェクト、テクスチャ ファイルを保持する m_TgaFile 変数を含むマップを生成します。文字列としての名前、頂点オブジェクトのベクトルを保持する m_Mesh 変数。これは、位置と tex 座標を保持する m_Positions と m_Textures の 2 つの float 配列を持つオブジェクトです。

これまでのところ、マップをループし、マップ内の最初のテクスチャ ファイルを使用してすべてのビットを描画することができました (数分後にクラッシュしますが、後でわかります。満足しています。何かが画面に表示された)。各マテリアルのテクスチャ ファイルを使用できるように、マップをループしている loadTextures () (およびマテリアルを送信) を呼び出してみましたが、何も描画されませんでした (白い画面)。では、描画のビットごとに各テクスチャをロードするにはどうすればよいでしょうか?

私はそれを調査しようとしましたが、glBindTexture、glTexImage2D、および覚えていない別のものを使用する必要があるという事実を思いつきました。最初の 2 つは、チュートリアルに付属の TgaParser にあります。glBindTexture は、2 番目のパラメーターがゼロの描画コードで再び使用されます。私が収集したものから、これはロードされたデフォルトのテクスチャを使用することを意味します。必要なときに各テクスチャをロードする方法がわかりません。テクスチャ名の意味と、それがテクスチャ データにどのように関連付けられるかがわかりません。

ああ、私は OpenGl のメイン関数でループを実行し、pMaterial を変数として表示関数に送信しようとしましたが、それは気に入らなかったので、うまくいくとは思いませんでしたが、少なくとも試してみると思いました。

ここにいくつかのコードがあります。

OpenGL の主な機能:

int main(int argc, char **argv)
{

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize(screenWidth, screenHeight);
glutCreateWindow("Intro to shading");
glewInit();

init();
glutDisplayFunc(forward_display);
glutIdleFunc(forward_animate);

glutMainLoop();
/*
    DONT DO THINGS HERE
*/
return 0;
}

描画機能:

void forward_display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//glScalef(0.5,0.5,0.5);
glScalef(0.005,0.005,0.005);
glRotatef(timeGetTime()*0.01,0,1,0);
GLfloat m[16];
glGetFloatv (GL_MODELVIEW_MATRIX, m);
glUniformMatrix4fv(gvModelMatrixHandle,1,false,m);


glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0);

colladaObject->m_MaterialMap.StartIterator ();

while(!colladaObject->m_MaterialMap.IsEOM ())
{
    shared_ptr<Material> pMaterial = colladaObject->m_MaterialMap.Get ();

    if(pMaterial->m_Mesh.size () != 0)
    {
        glVertexAttribPointer(gvPositionHandle, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), &pMaterial->m_Mesh[0].m_Positions);//v[0].pos

        glEnableVertexAttribArray(gvPositionHandle);

        glVertexAttribPointer(gvTextureCoordhandle, 2, GL_FLOAT, GL_FALSE,sizeof(Vertex), &pMaterial->m_Mesh[0].m_Textures);//&v[0].texCoords
        glEnableVertexAttribArray(gvTextureCoordhandle);

        glDrawArrays(GL_TRIANGLES, 0, pMaterial->m_Mesh.size());
    }
    colladaObject->m_MaterialMap.MoveNext ();
}

glutSwapBuffers();
}

初期化関数:

void init()
{
char  * vertexShaderBuffer =       readFileData("../resources/shaders/IntroToShaders.vs");
char  * pixelShaderBuffer  =   readFileData("../resources/shaders/IntroToShaders.ps");

gProgram = createProgram(vertexShaderBuffer, pixelShaderBuffer);

//We have finished  compiling the shader now delete the char arrays with the source code
delete [] vertexShaderBuffer;
delete [] pixelShaderBuffer;

gvPositionHandle        = glGetAttribLocation(gProgram, "vPosition");
gvTextureCoordhandle    = glGetAttribLocation(gProgram, "vTextureCoord");
gvModelMatrixHandle     = glGetUniformLocation(gProgram, "modelview_matrix");
if (gvPositionHandle==-1)
    printf("gvPositionHandle is bad\n");

if (gvTextureCoordhandle==-1)
    printf("gvTextureCoordhandle is bad\n");

if (gvModelMatrixHandle==-1)
    printf("gvModelMatrixHandle is bad\n");
glUseProgram(gProgram);

//cube = new ObjParser("../resources/mesh/cube.obj");
colladaObject = new ColladaParser("../resources/mesh/car.dae");
loadTextures();

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

loadTextures 関数:

void loadTextures ()
{
//just try loading the first texture to make sure all the other code changes work before playing with this one.
colladaObject->m_MaterialMap.StartIterator ();
shared_ptr<Material> pMaterial = colladaObject->m_MaterialMap.Get ();
while(pMaterial->m_TgaFile == "")
{
    colladaObject->m_MaterialMap.MoveNext ();
    pMaterial = colladaObject->m_MaterialMap.Get ();
}

char tgafile [100];
strcpy(tgafile, "../resources/textures/");
strcat(tgafile, pMaterial->m_TgaFile.c_str ());
TgaParser explosion(tgafile);
}

TgaParser コンストラクターの END (実際にファイルを開き、ビットを読み取る場所は他にもたくさんあります)

unsigned char * imageData = (unsigned char*)getData (fp, size, imageBits);
myId=id;

glBindTexture (GL_TEXTURE_2D, id);
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    /* glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
/* glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D (GL_TEXTURE_2D, 0, texFormat, imageWidth, imageHeight, 0, texFormat, GL_UNSIGNED_BYTE, imageData);

    /* release data, its been uploaded */
    free (imageData);

fclose(fp);

id++;
4

2 に答える 2

0

Collada パーサーにおめでとう。これは確かに複雑な作業です。それを行うために使用できるサードパーティのツールがありますが、自分でそれを行うことは良い習慣であり、学習であったと確信しています.

テクスチャに関しては、テクスチャを 1 つのテクスチャに結合するテクスチャ アトラスを使用するオプションが 1 つあります。一度バインドして、異なるテクスチャ座標を使用するだけで、テクスチャを変更せずにすべてのオブジェクトを描画できます。ルックアップ テクスチャ アトラス。

于 2013-04-21T07:56:13.640 に答える