【问题标题】:Why won't my texture render?为什么我的纹理不渲染?
【发布时间】:2013-11-09 11:12:51
【问题描述】:

由于某种原因,我加载的纹理不会显示/渲染。我已经获得了一个纹理,可以用几乎相同的代码在以前的项目上渲染,但由于某种原因,它不会用下面的代码渲染。我已经发布了 init() 和 createGreenFields() 方法,显示方法调用 gl.glCallList(1) 来创建字段。

public void init(GLAutoDrawable drawable) {
    // Initialize object state.

    glu = new GLU();
    GL2 gl = drawable.getGL().getGL2();
    gl.glEnable(GL.GL_DEPTH_TEST);
    gl.glDepthFunc(GL.GL_LEQUAL);
    gl.glShadeModel(GL2.GL_SMOOTH);

    try {
        grassTex = TextureIO.newTexture(new File(grassFile), true);
        grassTex.setTexParameteri(gl, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
        grassTex.setTexParameteri(gl, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
    } catch (Exception e) {
        System.out.println("Error loading texture " + e);
    }
    gl.glClearDepth(1.0f);

    createGreenFields(gl);
}

.
.
.

private void createGreenFields(GL2 gl) {
    int index = gl.glGenLists(1);
    gl.glNewList(index, GL2.GL_COMPILE);
    gl.glBegin(GL2.GL_QUADS); // Four vertices
    .
    .
    // do not draw the transparent parts of the texture
    gl.glEnable(GL.GL_BLEND);
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
    // don't show source alpha parts in the destination

    // determine which areas of the polygon are to be rendered
    gl.glEnable(GL2.GL_ALPHA_TEST);
    gl.glAlphaFunc(GL.GL_GREATER, 0); // only render if alpha > 0

    gl.glDisable(GL.GL_BLEND);
    // enable texturing
    //gl.glEnable(GL2.GL_TEXTURE_3D);
    grassTex.enable(gl);
    grassTex.bind(gl);

    // replace the quad colors with the texture
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);

    TextureCoords tc = grassTex.getImageTexCoords();

    // lower right field
    gl.glColor3f(0.0f, 0.3f, 0.0f); // Dark Green

    gl.glTexCoord2f(tc.left(), tc.bottom());
    gl.glVertex3f(-1.66f, 15.0f, 0f);

    gl.glTexCoord2f(tc.right(), tc.bottom());
    gl.glVertex3f(-15.0f, 15.0f, 0f);

    gl.glTexCoord2f(tc.right(), tc.top());
    gl.glVertex3f(-15.0f, 1.66f, 0f);

    gl.glTexCoord2f(tc.left(), tc.top());
    gl.glVertex3f(-1.66f, 1.66f, 0f);
    .
    .

public void display(GLAutoDrawable drawable) {
    .
    .
    gl.glCallList(1); // Creates Green Fields
    .
    .
}

【问题讨论】:

    标签: java opengl textures jogl texture2d


    【解决方案1】:

    由于您调用这两个 OpenGL 函数的方式,问题正在发生。

    glBegin(GL_QUADS);
    
    ... etc ...
    
    glEnd();
    

    调用glBegin()后只能使用以下OpenGL函数,直到调用glEnd()

    • glVertex()
    • glColor()
    • glSecondaryColor()
    • glIndex()
    • glNormal()
    • glFogCoord()
    • glTexCoord()
    • glMultiTexCoord()
    • glVertexAttrib()
    • glEvalCoord()
    • glEvalPoint()
    • glArrayElement()
    • glMaterial()
    • glEdgeFlag()

    也可以使用。

    • glCallList()
    • glCallLists()

    所以我们可以在你的代码中看到你调用glEnable()glDisable()glBlendFunc()glAlphaFunc() 并绑定纹理等所有这些你需要在调用glBegin()之前做的事情

    额外

    此外,如果您不知道,您正在使用已弃用的 OpenGL 函数。您应该了解和使用VBOsVAOs,并学习使用OpenGL 中的现代功能和处理方式。

    【讨论】:

    • 我不认为坚持使用旧的即时模式渲染对于 OpenGL 的介绍是不利的。不要误会我的意思,你不应该永远呆在那里(也不会考虑它有多慢),但特别是对于刚接触编程和内存管理的人来说,这是一个很好的垫脚石。
    • @jozxyqk 我完全同意你的看法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2014-08-09
    • 2018-09-16
    相关资源
    最近更新 更多