【问题标题】:texture filter not working in JOGL纹理过滤器在 JOGL 中不起作用
【发布时间】:2014-10-29 12:02:48
【问题描述】:

我正在尝试将纹理过滤器重复应用于我的立方体,但我无法解决问题

谁能帮我解决这个问题

这是我的一段代码

import java.io.IOException;
import java.io.InputStream;

import javax.media.opengl.GL;
import javax.media.opengl.GL2;

import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureIO;

/**
 * Box.java - a class implementation representing a Box object in OpenGL Oct 16,
 * 2013 rdb - derived from Box.cpp
 */

public class BoxNew extends Object3D {
    // --------- instance variables -----------------
    float length;

    // float replication = 1.0f; // # copies of texture on quad in each
    // direction
    // float offset = 0.0f;
    // Texture tex;

    // ------------- constructor -----------------------
    public BoxNew() {
        length = 1;
    }

    // ------------- drawPrimitives ---------------------------
    public void drawPrimitives() {


        JOGL.gl.glPushMatrix();
        JOGL. gl.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
        tex=setTexture("picc.jpg");
        tex.enable(JOGL.gl);
        //tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);
        //tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);  
        tex.setTexParameteri(JOGL.gl, GL2.GL_REPEAT,GL2.GL_TEXTURE_WRAP_T);

        tex.bind(JOGL.gl);

        JOGL.gl.glBegin(GL2.GL_QUADS);
        // Front Face
        JOGL.gl.glNormal3f(0.0f, 0.0f, 1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 0.0f);
        JOGL.gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 0.0f);
        JOGL.gl.glVertex3f(1.0f, -1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 1.0f);
        JOGL.gl.glVertex3f(1.0f, 1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 1.0f);
        JOGL.gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        // Back Face
        JOGL.gl.glNormal3f(0.0f, 0.0f, -1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 0.0f);
        JOGL.gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 1.0f);
        JOGL.gl.glVertex3f(-1.0f, 1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 1.0f);
        JOGL.gl.glVertex3f(1.0f, 1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 0.0f);
        JOGL.gl.glVertex3f(1.0f, -1.0f, -1.0f);
        // Top Face
        JOGL.gl.glNormal3f(0.0f, 1.0f, 0.0f);
        JOGL.gl.glTexCoord2f(0.0f, 1.0f);
        JOGL.gl.glVertex3f(-1.0f, 1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 0.0f);
        JOGL.gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 0.0f);
        JOGL.gl.glVertex3f(1.0f, 1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 1.0f);
        JOGL.gl.glVertex3f(1.0f, 1.0f, -1.0f);
        // Bottom Face
        JOGL.gl.glNormal3f(0.0f, -1.0f, 0.0f);
        JOGL.gl.glTexCoord2f(1.0f, 1.0f);
        JOGL.gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 1.0f);
        JOGL.gl.glVertex3f(1.0f, -1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 0.0f);
        JOGL.gl.glVertex3f(1.0f, -1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 0.0f);
        JOGL.gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        // Right face
        JOGL.gl.glNormal3f(1.0f, 0.0f, 0.0f);
        JOGL.gl.glTexCoord2f(1.0f, 0.0f);
        JOGL.gl.glVertex3f(1.0f, -1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 1.0f);
        JOGL.gl.glVertex3f(1.0f, 1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 1.0f);
        JOGL.gl.glVertex3f(1.0f, 1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 0.0f);
        JOGL.gl.glVertex3f(1.0f, -1.0f, 1.0f);
        // Left Face
        JOGL.gl.glNormal3f(-1.0f, 0.0f, 0.0f);
        JOGL.gl.glTexCoord2f(0.0f, 0.0f);
        JOGL.gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 0.0f);
        JOGL.gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(1.0f, 1.0f);
        JOGL.gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        JOGL.gl.glTexCoord2f(0.0f, 1.0f);
        JOGL.gl.glVertex3f(-1.0f, 1.0f, -1.0f);
        JOGL.gl.glEnd();
        JOGL.gl.glPopMatrix();

        tex.disable(JOGL.gl);

    }
}

【问题讨论】:

  • 到底是什么问题?您启用纹理过滤的代码已被注释掉。
  • 我的问题是我必须对我创建的盒子应用重复纹理

标签: java opengl jogl


【解决方案1】:

1.) 你在 setTexParameteri 中的参数是相反的。

 tex.setTexParameteri(JOGL.gl, GL2.GL_REPEAT,GL2.GL_TEXTURE_WRAP_T);

应该是

 tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_WRAP_T, GL2.GL_REPEAT);

您是否检查过某处的 gl 错误?

2.) 由于您的纹理坐标始终在 [0, 1] 范围内,您将看不到任何环绕模式。环绕模式仅定义如何处理 [0,1] 范围之外的纹理坐标。

【讨论】:

  • 非常感谢,所以我的纹理线应该在 [0, 1] 以上的范围内:不,我没有任何错误,我得到一个立方体,但重复不起作用
  • 如果你想有重复,那么是的。重复模式下的纹理坐标由 lookup_uv = fract(uv) 给出
【解决方案2】:

我不熟悉 JOGL 如何管理其纹理类的状态(这里隐藏了一些重要的细节),但传统上在 GL 中你不能设置参数,例如纹理过滤器或重复模式,直到你 绑定纹理。

你可以考虑这样修改你的代码:

    tex=setTexture("picc.jpg");
    tex.enable(JOGL.gl);

    /* Bind First */

    tex.bind(JOGL.gl);

    /* Then Set States */

    //tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);
    //tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);  
    tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_WRAP_S, GL2.GL_REPEAT);
    tex.setTexParameteri(JOGL.gl, GL2.GL_TEXTURE_WRAP_T, GL2.GL_REPEAT);

我还擅自为 S 坐标方向设置了纹理重复模式。您最初编写的代码只会在 T 方向重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多