1

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

那么错误是什么?

4

1 回答 1

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 ?)

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

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

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

于 2013-08-23T02:34:24.393 回答