1

私が尋ねた最後の質問は、OpenGL でさまざまなモデルを描画する方法についてでした。私はそれをカバーしましたが、今はテクスチャを行うことに行き詰まっています。ここでも、テクスチャを1 つしか使用しない限り、テクスチャを簡単に機能させることができます。

テクスチャをロードするクラス:

public class Textures
{

    public static int tex, tex2;

    public static void load() throws IOException
    {
        tex = glGenTextures();
        tex2 = glGenTextures();

        load(tex2, "moreModels/robot.jpg", "jpg");
        load(tex, "moreModels/sample.jpg", "jpg");
    }

    public static void load(int tex, String name, String type) throws IOException
    {
        glBindTexture(GL43.GL_TEXTURE_2D, tex);

        glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

        glGenerateMipmap(GL43.GL_TEXTURE_2D);

        glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameterIi(GL43.GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

        Texture texture = TextureLoader.getTexture(type, ResourceLoader.getResourceAsStream(name));

        byte[] pixels = texture.getTextureData();

        ByteBuffer buffer = BufferUtils.createByteBuffer(pixels.length);
        buffer.put(pixels);
        buffer.flip();
        glTexImage2D(GL43.GL_TEXTURE_2D, 0, GL_BGR, texture.getImageWidth(), texture.getImageHeight(), 0, GL_BGR, GL_BYTE, buffer);
    }
}

さて、 glBindTexture(GL43.GL_TEXTURE_2D, textureID)を呼び出すだけでテクスチャが変更されると思いますが、そうではありません。いつでも glBindTexture メソッドを呼び出すと、すべてが黒くレンダリングされます。

テクスチャを変更する必要があるたびに、ロード メソッド全体を実行する必要がある以前と同じですか? (おそらく Texture オブジェクトを保存するので、何度も読み込む必要はありません)。もしそうなら、変更されたときに glGenTextures() が明らかにすべてを忘れている場合、glGenTextures() を使用する意味は何ですか?

4

1 に答える 1

2

OpenGLテクスチャの理解が少し間違っていると思います。覚えておく必要があります。新しい画像をロードするたびに、質問で示したルーチンを使用して新しいテクスチャ オブジェクトを作成する必要があります。さらに、更新するだけの場合は(ピクセルを置き換える) 既存のテクスチャの場合、glTexSubImage2Dを使用する必要があります。この方法では、新しいテクスチャ オブジェクトを作成せずに、既存のデータを更新します。

ここで、複数のテクスチャが必要な場合、たとえば、1 つはカラー マップとして、もう 1 つは法線マップとして、フラグメント シェーダー サンプラーによってアクセスされる 2 つのテクスチャを最初から作成する必要があります。

コードに基づいて、セットアップ全体 (レンダリング ループ、シェーダー) をどのように行うかを理解するのは困難です。詳細情報を提供すると、さらに支援することが可能になります。

于 2013-01-21T19:11:41.793 に答える