OpenGL使用每个模型的特定纹理

时间:2013-01-21 17:21:50

标签: opengl textures lwjgl

我问过的最后一个问题是如何在OpenGL中绘制不同的模型。我得到了覆盖,但现在我坚持做纹理。只要我只使用一个纹理,我就可以轻松获得纹理。

加载纹理的类:

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()在改变时显然会忘记它的一切时,有什么意义呢?

1 个答案:

答案 0 :(得分:2)

我认为您对OpenGL texture的理解有点错误。您必须记住:每次加载新图像时,都必须使用您在问题中显示的例程创建新的纹理对象。 ,如果你只想更新(替换像素)现有纹理,你应该使用glTexSubImage2D。这样你就不会创建新的纹理对象,而是更新现有纹理对象。

现在,如果你想要有几个纹理,比如一个作为颜色贴图而另一个作为法线贴图,那么你必须从头创建2个纹理,这些纹理将由片段着色器采样器访问。

根据您的代码,您很难看到如何进行整个设置(渲染循环,着色器)。如果您提供更多信息,则可以进一步为您提供帮助。