2

2 つのテクスチャを読み込んでから、表示機能で 2 つのテクスチャを切り替えようとしています。SOIL ライブラリを使用して、テクスチャを次のようにロードしています。

tex_2 = SOIL_load_OGL_texture
    (
            "s9.png",
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT
    );

tex_1 = SOIL_load_OGL_texture
    (
            "s8.png",
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT
    );

そして、私は使用します

glBindTexture(GL_TEXTURE_2D, tex_1) 
or
glBindTexture(GL_TEXTURE_2D, tex_2);

2 つを切り替えるには。問題は、それらを間違ってロードしているに違いなく、その方法がわからないことです。最後にロードしたテクスチャ (上記のコードの tex_1) は、glBindTexture で切り替えようとしたときに tex_1 と tex_2 の両方で得られるテクスチャです。何か案は?

teaxture をロードする前に、ブレンドを設定し、テクスチャとスプライトをオンにします

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

次に、表示関数で、描画するすべてのポイントをループし、glVertex3f でポイントを描画する前に現在のテクスチャを変更しようとします。

for(int i=0; i<num_particles; i++)
{
    //select texture to use
    if(class[i] == 2.0f)
        glBindTexture(GL_TEXTURE_2D, tex_2);
    else
        glBindTexture(GL_TEXTURE_2D, tex_1);

    glVertex3f(posn[3*i], posn[3*i+1], posn[3*i+2]);
}

目標は、2 種類のポイントがあり、各ポイントで描画されるスプライトは、ポイントが属するクラスに依存することです。

4

2 に答える 2

3
for(int i=0; i<num_particles; i++)
{
    //select texture to use
    if(class[i] == 2.0f)
        glBindTexture(GL_TEXTURE_2D, tex_2);
    else
        glBindTexture(GL_TEXTURE_2D, tex_1);

    glVertex3f(posn[3*i], posn[3*i+1], posn[3*i+2]);
}

You can't call glBindTexture() inside a glBegin()/glEnd() pair:

GL_INVALID_OPERATION is generated if glBindTexture is executed between the execution of glBegin and the corresponding execution of glEnd.

The last successful glBindTexture() was probably in the most recent SOIL_load_OGL_texture() call. That's why tex_1 and tex_2 seem to contain the same texture data: tex_2 is never rebound.

于 2013-04-17T17:48:45.643 に答える
1

前の回答のように、glBegin/glEnd の間でテクスチャを変更することはできません。

では何ができるでしょうか?

  • パーティクルをマテリアルでソートします...この場合はテクスチャでソートします。最初のテクスチャを設定し、パーティクル (glBegin/glEnd) を描画し、次に 2 番目のテクスチャを設定して残りのパーティクルを描画します。
  • テクスチャ アトラスを使用します - http://en.wikipedia.org/wiki/Texture_atlas。より高度な使用法を次に示します: http://www.popcornfx.com/wiki/index.php/Particle_tutorial_smoke
    • そうすれば、テクスチャは 1 つになりますが、異なるテクスチャ座標を設定する必要があります...
于 2013-04-17T18:12:38.530 に答える