如何在切片模式下制作纹理?

时间:2013-08-14 11:34:30

标签: opengl textures jogl

我有一个带有纹理的GL.GL_QUAD_STRIP,因为GL.GL_QUAD_STRIP尺寸比纹理图像尺寸大得多,这个图像变得拉伸和模糊,所以我想也许有办法设置这个在“切片”模式下纹理,使其更清晰,更锐利。

编辑:“切片”我的意思是在图像结束的位置我将开始再次绘制,除了出现一个白色的硬拉伸。

这就是我到目前为止 -

double m_x , m_y  , m_z ; 
Texture m_cubeSides ; 

public void display(GLAutoDrawable gLDrawable)
{
        final GL gl = gLDrawable.getGL();
        gl.glTexParameteri ( GL.GL_TEXTURE_2D,GL.GL_TEXTURE_WRAP_T,GL.GL_LINEAR_MIPMAP_LINEAR);
        gl.glTexParameteri( GL.GL_TEXTURE_2D,GL.GL_TEXTURE_WRAP_S,GL.GL_LINEAR_MIPMAP_LINEAR);
        m_cubeSides.bind();
        gl.glBegin(GL.GL_QUAD_STRIP);

        // Quad 1

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3d(m_x, m_y, 0);
        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3d(m_x, 0, 0);
        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3d(0, m_y, 0);
        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3d(0, 0, 0);

        // Quad 2 - front 

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3d(0, m_y, m_z);
        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3d(0, 0, m_z);
        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3d(m_x, m_y, m_z);
        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3d(m_x, 0, m_z);

        //  Quad 3 - east side 

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3d(m_x, m_y, m_z);
        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3d(m_x, 0, m_z);
        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3d(m_x, m_y, 0);
        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3d(m_x, 0, 0);

        //  Quad 4 - west side 

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3d(0, m_y, 0);
        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3d(0, 0, 0);
        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3d(0, m_y, m_z);
        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3d(0, 0, m_z);

        gl.glEnd(); 
}

1 个答案:

答案 0 :(得分:1)

我不确定切片模式的含义,但更改纹理坐标会起作用。有很多对glTexCoord2f的调用,所以可能是一个变量来替换1.0f调用中glTexCoord2f的所有实例,然后改变它,直到得到一个好的结果。您已经将纹理包装模式设置为重复,这是必需的。

类似的东西:

 float textureMax = 5.0f;
 ...
 gl.glTexCoord2f(textureMax , 0.0f);
 gl.glVertex3d(m_x, m_y, 0);
 gl.glTexCoord2f(textureMax ,textureMax );
 gl.glVertex3d(m_x, 0, 0);
 gl.glTexCoord2f(0.0f, 0.0f);
 gl.glVertex3d(0, m_y, 0);
 gl.glTexCoord2f(0.0f, textureMax );
 gl.glVertex3d(0, 0, 0);

这样做的缺点是你需要一个可以平铺的纹理,否则这可能看起来不太好。

另一个选择是更大的纹理,当然:)