【问题标题】:Making a cubemap in lwjgl在 lwjgl 中制作立方体贴图
【发布时间】:2012-09-27 03:57:59
【问题描述】:

这是我尝试创建cube map

glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_CUBE_MAP);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
PNGDecoder pngDecoder = new PNGDecoder(ResourceLoader.getResourceAsStream("C:/desert_skymap_sample.png"));
ByteBuffer temp = ByteBuffer.allocateDirect(4*pngDecoder.getWidth() * pngDecoder.getHeight());
pngDecoder.decode(temp, pngDecoder.getWidth()*4, PNGDecoder.Format.RGBA);
temp.flip();
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp);


    gluLookAt(0,0,0, xtrans+xpos,ytrans+walkbias,ztrans+zpos, 0,1,0);

    glPushAttrib(GL_ENABLE_BIT);
    glDisable(GL_DEPTH_TEST);

    glColor4f(1,1,1,1);

    glBindTexture(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_POSITIVE_X);
    glBegin(GL_QUADS);
      glTexCoord2f(0, 0);
      glVertex3f(1f, -1f, -1f);
      glTexCoord2f(1, 0);
      glVertex3f(-1f, -1f, -1f);
      glTexCoord2f(1, 1);
      glVertex3f(-1f, 1f, -1f);
      glTexCoord2f(0, 1);
      glVertex3f(1f, 1f, -1f);
    glEnd();

    glBindTexture(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_NEGETIVE_X);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0);
        glVertex3f(1f, -1f, 1f);
        glTexCoord2f(1, 0);
        glVertex3f(1f, -1f, -1f);
        glTexCoord2f(1, 1);
        glVertex3f(1f, 1f, -1f);
        glTexCoord2f(0, 1);
        glVertex3f(1f, 1f, 1f);
    glEnd();

我正在使用 TWL 的 PngDecoder。问题是我不知道如何获取纹理 id/retreve TexImage2D 或者我是否正确执行。

如何在 LWJGL 中制作立方体贴图?

【问题讨论】:

    标签: java png textures lwjgl


    【解决方案1】:

    我想你会希望在一开始的某个地方打一个gluLookAt 电话,以便正确设置相机变换。

    看看:

    上面示例中的camera->x, camera->y, camera->z 元素应替换为描述您的相机正在观看的方向的向量。

    【讨论】:

    • 这是什么语法?相机 -> x?
    • 这个答案有帮助,已经足够好了。我仍然需要立方体贴图的帮助,但对于最初的天空盒问题,这很好。
    【解决方案2】:

    您需要在代码中添加一些内容才能使其正常工作:

    1. 正如 mikera 所述,您需要使用 glLookAt 设置“相机”。
    2. 您还需要定义几何图形来渲染纹理。最简单的方法是在二维空间中围绕相机定义一个框。不要忘记设置面部法线。

    这里有一篇关于使用 opengl 进行硬件立方体映射的大量文章(它是一个多供应商扩展):http://www.nvidia.com/object/cube_map_ogl_tutorial.html

    【讨论】:

    • 我查看了该教程,但是当我尝试运行该示例时,由于没有 GL_EXT_TEXTURE_CUBE_MAP 而出现错误。我不明白这个错误,我有 OpenGL 3.0。
    • 另外,你说的数字 2 是什么?
    • 我看到您现在已经在原始问题中添加了绘图代码。对于第 2 点,我的意思是您需要设置一些几何图形来映射立方体纹理(正如我所说,最初我看不到您的绘制代码)。此外,根据我链接的文章,一些生成的纹理坐标取决于您在几何体上正确设置顶点法线。
    • 关于您收到的错误,您似乎需要包含多供应商立方体地图扩展。您可以使用 glGetString(GL_EXTENSIONS) 检查它是否已包含在您的 opengl 版本中,以确保列出 GL_EXT_texture_cube_map 字符串。
    • 我不知道我做了什么,但教程现在可以使用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多