繁体   English   中英

纹理图集纹理坐标数学

[英]Texture Atlas Texture Coordinates math

我正在为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

那是什么错误呢?

(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)。 在纹理图集的背景下进行纹理包裹几乎没有意义,因此坐标超出范围可能意味着您做错了:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM