OpenGL纹理与面不匹配

OpenGL纹理与面不匹配,opengl,graphics,3d,lwjgl,kotlin,Opengl,Graphics,3d,Lwjgl,Kotlin,我正在使用LWJGL创建一个简单的体素,作为一些实践,作为一个中等简单的项目来熟悉自己 所以我已经完成了体素渲染,除了渲染每个面的不同纹理的体素 看起来不错,直到我开始四处走动。。。然后: 如果有人需要整个回购协议,那就是 至于相关的类,我不太确定什么是相关的,但下面是生成glVertex3f和glTexture2f的东西: public class Shape { class object { public fun CreateCube(x: Float, y

我正在使用LWJGL创建一个简单的体素,作为一些实践,作为一个中等简单的项目来熟悉自己

所以我已经完成了体素渲染,除了渲染每个面的不同纹理的体素

看起来不错,直到我开始四处走动。。。然后:

如果有人需要整个回购协议,那就是

至于相关的类,我不太确定什么是相关的,但下面是生成glVertex3f和glTexture2f的东西:

public class Shape
{
    class object
    {
        public fun CreateCube(x: Float, y: Float, z: Float, colour: ColourRGBA, tex: MutableList<TextureCoords>, size: Float)
        {
            val sheet: Spritesheet = Main.Instance!!.blocksprites

            var textures: MutableList<TextureCoords> = arrayListOf()
            if (tex.size == 1)
            {

                for (i in 0 .. 5)
                    textures.add(tex[0])
            }
            else
                textures.addAll(tex)







            // bottom face
            // bottom face (0, 1)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[0].x, textures[0].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z + size);
            GL11.glTexCoord2f(textures[0].x + sheet.GetUniformSize(), textures[0].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z + size);
            GL11.glTexCoord2f(textures[0].x + sheet.GetUniformSize(), textures[0].y);
            GL11.glVertex3f(x + size, y, z);
            GL11.glTexCoord2f(textures[0].x, textures[0].y);
            GL11.glVertex3f(x, y, z);

            // top face (2, 3)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[1].x, textures[1].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y + size, z);
            GL11.glTexCoord2f(textures[1].x + sheet.GetUniformSize(), textures[1].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y + size, z);
            GL11.glTexCoord2f(textures[1].x + sheet.GetUniformSize(), textures[1].y);
            GL11.glVertex3f(x + size, y + size, z + size);
            GL11.glTexCoord2f(textures[1].x, textures[1].y);
            GL11.glVertex3f(x, y + size, z + size);

            // front face (4, 5)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[2].x, textures[2].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z);
            GL11.glTexCoord2f(textures[2].x + sheet.GetUniformSize(), textures[2].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z);
            GL11.glTexCoord2f(textures[2].x + sheet.GetUniformSize(), textures[2].y);
            GL11.glVertex3f(x + size, y + size, z);
            GL11.glTexCoord2f(textures[2].x, textures[2].y);
            GL11.glVertex3f(x, y + size, z);

            // back face (6, 7)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[3].x, textures[3].y);
            GL11.glVertex3f(x, y + size, z + size);
            GL11.glTexCoord2f(textures[3].x + sheet.GetUniformSize(), textures[3].y);
            GL11.glVertex3f(x + size, y + size, z + size);
            GL11.glTexCoord2f(textures[3].x + sheet.GetUniformSize(), textures[3].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z + size);
            GL11.glTexCoord2f(textures[3].x, textures[3].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z + size);

            // left face (8, 9)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[4].x, textures[4].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z);
            GL11.glTexCoord2f(textures[4].x + sheet.GetUniformSize(), textures[4].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z + size);
            GL11.glTexCoord2f(textures[4].x + sheet.GetUniformSize(), textures[4].y);
            GL11.glVertex3f(x + size, y + size, z + size);
            GL11.glTexCoord2f(textures[4].x, textures[4].y);
            GL11.glVertex3f(x + size, y + size, z);

            // right face (10, 11)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[5].x, textures[5].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z + size);
            GL11.glTexCoord2f(textures[5].x + sheet.GetUniformSize(), textures[5].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z);
            GL11.glTexCoord2f(textures[5].x + sheet.GetUniformSize(), textures[5].y);
            GL11.glVertex3f(x, y + size, z);
            GL11.glTexCoord2f(textures[5].x, textures[5].y);
            GL11.glVertex3f(x, y + size, z + size);
        }
    }
}
公共类形状
{
类对象
{
公共娱乐CreateCube(x:Float,y:Float,z:Float,颜色:colorRGBA,tex:MutableList,大小:Float)
{
val表:Spritesheet=Main.Instance!!.blocksprites
var纹理:MutableList=arrayListOf()
如果(tex.size==1)
{
对于(0..5中的i)
纹理。添加(tex[0])
}
其他的
纹理。添加全部(tex)
//底面
//底面(0,1)
GL11.glColor4f(color.red.toFloat()、color.green.toFloat()、color.blue.toFloat()、color.alpha.toFloat());
GL11.glTexCoord2f(纹理[0].x,纹理[0].y+sheet.GetUniformSize());
GL11.glVertex3f(x,y,z+大小);
GL11.glTexCoord2f(纹理[0].x+sheet.GetUniformSize(),纹理[0].y+sheet.GetUniformSize());
GL11.glVertex3f(x+大小,y,z+大小);
GL11.glTexCoord2f(纹理[0].x+sheet.GetUniformSize(),纹理[0].y);
GL11.glVertex3f(x+大小,y,z);
GL11.glTexCoord2f(纹理[0].x,纹理[0].y);
GL11.glVertex3f(x,y,z);
//顶面(2,3)
GL11.glColor4f(color.red.toFloat()、color.green.toFloat()、color.blue.toFloat()、color.alpha.toFloat());
GL11.glTexCoord2f(纹理[1].x,纹理[1].y+sheet.GetUniformSize());
GL11.glVertex3f(x,y+大小,z);
GL11.glTexCoord2f(纹理[1].x+sheet.GetUniformSize(),纹理[1].y+sheet.GetUniformSize());
GL11.glVertex3f(x+大小,y+大小,z);
GL11.glTexCoord2f(纹理[1].x+sheet.GetUniformSize(),纹理[1].y);
GL11.glVertex3f(x+尺寸,y+尺寸,z+尺寸);
GL11.glTexCoord2f(纹理[1].x,纹理[1].y);
GL11.glVertex3f(x,y+大小,z+大小);
//正面(4、5)
GL11.glColor4f(color.red.toFloat()、color.green.toFloat()、color.blue.toFloat()、color.alpha.toFloat());
GL11.glTexCoord2f(纹理[2].x,纹理[2].y+sheet.GetUniformSize());
GL11.glVertex3f(x,y,z);
GL11.glTexCoord2f(纹理[2].x+sheet.GetUniformSize(),纹理[2].y+sheet.GetUniformSize());
GL11.glVertex3f(x+大小,y,z);
GL11.glTexCoord2f(纹理[2].x+sheet.GetUniformSize(),纹理[2].y);
GL11.glVertex3f(x+大小,y+大小,z);
GL11.glTexCoord2f(纹理[2].x,纹理[2].y);
GL11.glVertex3f(x,y+大小,z);
//背面(6、7)
GL11.glColor4f(color.red.toFloat()、color.green.toFloat()、color.blue.toFloat()、color.alpha.toFloat());
GL11.glTexCoord2f(纹理[3].x,纹理[3].y);
GL11.glVertex3f(x,y+大小,z+大小);
GL11.glTexCoord2f(纹理[3].x+sheet.GetUniformSize(),纹理[3].y);
GL11.glVertex3f(x+尺寸,y+尺寸,z+尺寸);
GL11.glTexCoord2f(纹理[3].x+sheet.GetUniformSize(),纹理[3].y+sheet.GetUniformSize());
GL11.glVertex3f(x+大小,y,z+大小);
GL11.glTexCoord2f(纹理[3].x,纹理[3].y+sheet.GetUniformSize());
GL11.glVertex3f(x,y,z+大小);
//左脸(8,9)
GL11.glColor4f(color.red.toFloat()、color.green.toFloat()、color.blue.toFloat()、color.alpha.toFloat());
GL11.glTexCoord2f(纹理[4].x,纹理[4].y+sheet.GetUniformSize());
GL11.glVertex3f(x+大小,y,z);
GL11.glTexCoord2f(纹理[4].x+sheet.GetUniformSize(),纹理[4].y+sheet.GetUniformSize());
GL11.glVertex3f(x+大小,y,z+大小);
GL11.glTexCoord2f(纹理[4].x+sheet.GetUniformSize(),纹理[4].y);
GL11.glVertex3f(x+尺寸,y+尺寸,z+尺寸);
GL11.glTexCoord2f(纹理[4].x,纹理[4].y);
GL11.glVertex3f(x+大小,y+大小,z);
//右脸(10,11)
GL11.glColor4f(color.red.toFloat()、color.green.toFloat()、color.blue.toFloat()、color.alpha.toFloat());
GL11.glTexCoord2f(纹理[5].x,纹理[5].y+sheet.GetUniformSize());
GL11.glVertex3f(x,y,z+大小);
GL11.glTexCoord2f(纹理[5].x+sheet.GetUniformSize(),纹理[5].y+sheet.GetUniformSize());
GL11.glVertex3f(x,y,z);
GL11.glTexCoord2f(纹理[5].x+sheet.GetUniformSize(),纹理[5].y);
GL11.glVertex3f(x,y+大小,z);
GL11.glTexCoord2f(纹理[5].x,纹理[5].y);
GL11.glVertex3f(x,y+大小,z+大小);
}
}
}
编辑:经过更多的测试后,我意识到只有当相机位于所讨论的体素上方时,我才会出现奇怪的故障。我在其他地方放置了类似的砌块,只露出侧面,从底部看,它们很好:

摄像头略高于模块(摄像头越远,问题越严重): 块下方的摄像头:

编辑2:经过更多的测试,问题在于任何两种不同材质的块都会相互作用。。。所以这可能不是一个面对面的事情,而是一个面对面的互动的事情?我不知道

编辑3:我决定尝试找出问题所在,因此我从代码中删除了glTexCoords2f()调用。不幸的是,问题依然存在:

如此

GLU.GLU透视图(67.0f,(宽/高)