我问过的最后一个问题是如何在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()在改变时显然会忘记它的一切时,有什么意义呢?
答案 0 :(得分:2)
我认为您对OpenGL texture的理解有点错误。您必须记住:每次加载新图像时,都必须使用您在问题中显示的例程创建新的纹理对象。 ,如果你只想更新(替换像素)现有纹理,你应该使用glTexSubImage2D。这样你就不会创建新的纹理对象,而是更新现有纹理对象。
现在,如果你想要有几个纹理,比如一个作为颜色贴图而另一个作为法线贴图,那么你必须从头创建2个纹理,这些纹理将由片段着色器采样器访问。
根据您的代码,您很难看到如何进行整个设置(渲染循环,着色器)。如果您提供更多信息,则可以进一步为您提供帮助。