【问题标题】:Texturing Quadrics in JOGLJOGL 中的纹理二次曲面
【发布时间】:2011-05-06 12:04:28
【问题描述】:

我无法对 glu Quadric (gluSphere) 进行纹理处理: 我得到的不是纹理,而是纹理的平均颜色。

gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_BLEND);
gl.glEnable(GL.GL_TEXTURE_GEN_S); 
gl.glEnable(GL.GL_TEXTURE_GEN_T); 

sunTexture = TextureIO.newTexture(new File("sun.jpg"),false);

float[] rgba = {1f, 1f, 1f};
gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, rgba, 0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, rgba, 0);
gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, 0.5f);

sunTexture.enable();
sunTexture.bind();
    GLUquadric sun = glu.gluNewQuadric();
    glu.gluQuadricTexture(sun, true);
    glu.gluSphere(sun, 5, DETAIL, DETAIL);
sunTexture.disable();

【问题讨论】:

    标签: opengl textures jogl glu


    【解决方案1】:

    由于 GLU 自己生成纹理坐标并将它们作为 glTexCoord 传输,我认为没有必要启用 texcoord 生成 (GL_TEXTURE_GEN_S/T)。我想 GLU 生成的 texCoords 会被 texgen 覆盖。

    我还看到,您向 glMaterial 提交了一个包含三个浮点数的数组,它需要 RGBA(4 个浮点数)。但由于我使用 C++,我可能错了,这适用于 JoGL。

    【讨论】:

    • 移除 GL_TEXTURE_GEN_S/T 将改变纹理坐标。通过这些移除,纹理非常扭曲/拉伸。启用它们后,纹理只是纯色。
    • 但是使用 texgen 是错误的。或者你使用 texgen 并且不调用 gluQuadricTexture,但是没有用于球形纹理坐标的内置 texgen。这就是 gluQuadricTexture 的用途。
    • glu 应该计算球体的通常经纬度映射(如地球上的纬度/经度圈)。所以你得到从一个极点到另一个极点的 t 坐标,以及围绕球体 360 度的 s 坐标。如果这不是您的 sun.jpg 的用途,则您必须自己计算坐标并制作自己的球体对象。使用普通图像作为纹理,您总是会在两极处出现失真,您的图像必须对此进行补偿。
    • 无论我如何旋转球体,纹理都同样扭曲,并且总是包裹起来,好像一根杆子正对着相机。
    【解决方案2】:

    我发现了问题: 我已经设置 gl.glFrustum(-20, 20, -20, 20, 0.1, 400);

    设置后 gl.glFrustum(-20, 20, -20, 20, 1, 400);

    看起来不错。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多