纹理地图集纹理坐标数学

时间:2013-08-23 01:20:26

标签: java opengl lwjgl

我正在为opengl编写一个lwjgl纹理图集,我的纹理图集创建工作正常,但是当我去渲染它时,对象显示出来,但它完全是黑色的。我认为这是因为我的纹理坐标位于纹理图集的空白部分。由于我没有正确设置混合,并且由于对象是我渲染的第一件事,因此alpha变为完全黑色。我知道这是因为我在0,0,0渲染了一个测试四边形,可以看到对象的轮廓。当我以其他顺序渲染它们时,轮廓不存在,因为那时混合工作正常。这是我的纹理坐标移动代码来改变坐标m_height和m_width是整个纹理图集的高度和宽度以及x,y,w,并且是地图集中纹理的位置,宽度和高度x, y来自左上角,texCoordinate2D来自左下角我相信,这就是我做m_height-yh的原因。它可以正常纹理而不是图集。

public TexCoordinate2D getTextureCoord(int x, int y, int w, int h,
                                       TexCoordinate2D coord) {
    int nx = x;
    int ny = (m_height - y) - h;
    //to fix m_repeat
    float cx = coord.getX();//going to fix repeat here
    float cy = coord.getY();
    int cpx = (int) (nx + (cx * w));
    int cpy = (int) (ny + (cy * h));
    float ncoordx =  cpx/(float) m_width;
    float ncoordy =  cpy/(float) m_height;
    System.out.println("Rect: " + x + " " + y + " " + w + " " + h);
    System.out.println("Coord: x: " + coord.getX() + " y: " + coord.getY());
    System.out.println("Coord--> pixel: x: " + cpx + " y: " + cpy);
    System.out.println("Pixel-->Coord: x: " + ncoordx + " y: " + ncoordy);
    TexCoordinate2D newCoord = new TexCoordinate2D(ncoordx, ncoordy);
    m_coordinates.add(newCoord);
    return newCoord;
}

这是一些打印输出

Rect: 0 0 512 512 #The rectangle from the top left corner of atlas
Coord: x: 0.5004405 y: 0.55040383 #The input coord from bottom left corner of texture
Coord--> pixel: x: 256 y: 3865 #The pixel location in the atlas of the input coord  the from bottom left corner
Pixel-->Coord: x: 0.0625 y: 0.9436035 #The coordinates in the atlas (The finished product)
Rect: 3072 0 256 256 #Starts again
Coord: x: 0.56088686 y: 0.5795429
Coord--> pixel: x: 3215 y: 3988
Pixel-->Coord: x: 0.7849121 y: 0.9736328
Rect: 2560 0 512 512
Coord: x: 0.18178056 y: 0.35738176
Coord--> pixel: x: 2653 y: 3766
Pixel-->Coord: x: 0.6477051 y: 0.9194336

那是什么错误?

1 个答案:

答案 0 :(得分:1)

(0,0)在OpenGL标准化纹理坐标的左下角,(1,1)在右上角。

从您的示例输出中,我看到:

Rect: 1024 0 512 512
Coord: x: 0.737651 y: 0.30223513
Coord--> pixel: x: 1401 y: 4249
Pixel-->Coord: x: 0.34212455 y: 1.0376068  (texture coordinates ?)

您在此示例中使用的纹理坐标超出了标准化范围。发生这种情况时,行为取决于纹理包装状态。可以简单地钳制坐标,可以使用边框颜色,纹理可能重复( 默认 ),可能会使用镜像等。

鉴于默认的纹理包裹行为(重复),您的T坐标(1.0376068)基本上变为(0.0376068)。纹理包裹在纹理图集的上下文中很少有意义,因此具有坐标超出范围可能意味着你做错了什么:)

您还需要注意,当您从偏心位置采样时,纹理坐标需要与纹理像素中心对齐,或者地图集中的附近纹素可能会出血。由于几乎不可能让屏幕上的每个像素都映射到纹理中心,除了最简单的几何外,通常的解决方案是使用它...在地图集中的每个纹理周围放置一个边框,这样即使最接近的纹素靠近纹理的边缘,纹理过滤永远不会触及相邻纹理的样本。