【问题标题】:I have a black texture我有黑色纹理
【发布时间】:2020-07-24 15:15:56
【问题描述】:

这是我第一次在 OpenGL 中使用纹理,尽管我已经研究了 4 个月。当我尝试加载纹理(只是一个带有正方形的图像)时,我得到的只是一个黑色正方形。\

我的纹理加载代码:

  byte[] pixelData = new byte[0];
        try {
            BufferedImage bi = ImageIO.read(getClass().getResource(TEXTURE_FILES));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bi, "png", baos);
            baos.flush();
            pixelData = baos.toByteArray();
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ByteBuffer byteBuffer = ByteBuffer.wrap(pixelData);
        int texId = glGenTextures();
        glBindTexture(GL_TEXTURE_2D, texId);
        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_GENERATE_MIPMAP, GL_FALSE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 500, 500, 0,
                GL_RGB, GL_UNSIGNED_BYTE, byteBuffer);

        return texId;

我尝试使用更简单的方法加载纹理,但没有奏效。我也尝试了另一个图像或将纹理放在我的 jar 文件中

纹理展示代码:

                glEnable(GL_TEXTURE_2D);
                glColor4f(1f, 1f, 1f, 1f);
                glBindTexture(GL_TEXTURE_2D, texId);
                glBegin(GL_QUADS);
                glTexCoord2f(0, 0);
                glVertex2f(-1, -1);
                glTexCoord2f(1, 0);
                glVertex2f(1, -1);
                glTexCoord2f(1, 1);
                glVertex2f(1, 1);
                glTexCoord2f(0, 1);
                glVertex2f(-1, 1);
                glEnd();
                glDisable(GL_TEXTURE_2D);

我的opengl参数:

        glEnable(GL_ALPHA_TEST);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_BLEND);
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glEnable(GL_NORMALIZE);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glShadeModel(GL_SMOOTH);
        glColorMask (true, true, true, true);
        glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);

我还阅读了这个论坛的许多其他提示,但它们对我也无用

我的结果:

我也尝试在另一台具有不同显卡的计算机上运行它,但结果仍然相同

【问题讨论】:

  • glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE) 没有任何意义。 GL_GENERATE_MIPMAP 不是有效的纹理参数。
  • @Rabbid76 如果我删除它,问题仍然存在
  • 是的,我知道,这并不能解决问题,它只是一个旁注。我不知道你的代码有什么问题。您最后的所有问题似乎都是同一个问题。
  • @Rabbid76 正如我所看到的,您在使用 OpenGL 方面拥有丰富的经验。不知道我的黑色纹理是什么问题?第四天我不能解决这个问题。我在几个不同的论坛中访问了 100 多个不同的页面,但没有任何帮助...
  • 我有很多OpenGL知识,但是我的Java知识很差。我在 OpenGL 指令中看不到任何问题。

标签: java opengl textures lwjgl opengl-compat


【解决方案1】:

问题可能是读取 png 文件:

BufferedImage bi = ImageIO.read(getClass().getResource(TEXTURE_FILES));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "png", baos);
baos.flush();
pixelData = baos.toByteArray();
baos.close();

我找到了一个循环读取文件的 cde sn-p (LWJGL3 Texture):

InputStream is = getClass().getResourceAsStream(TEXTURE_FILES);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read1 = is.read();
while (read1 != -1) { 
    baos.write(read1);
    read1 = is.read();
}
byte[] pixelData= baos.toByteArray();
baos.close();
ByteBuffer byteBuffer = ByteBuffer.wrap(pixelData);

或者使用PNGDecoder
(另见Load a PNG file with pure OpenGLLoading PNG images with TWL's PNGDecoder

InputStream in = getClass().getResourceAsStream(TEXTURE_FILES);
PNGDecoder decoder = new PNGDecoder(in);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3*decoder.getWidth()*decoder.getHeight());
decoder.decode(byteBuffer, decoder.getWidth()*3, PNGDecoder.Format.RGB);
byteBuffer.flip();

【讨论】:

  • 谢谢。它真的帮助了我。还有一些问题,但绝对与此无关。主要的是我看到了我的纹理。我不认为 OpenGL 需要特殊的纹理加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2014-06-28
  • 2016-06-05
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多