相关疑难解决方法(0)

像素空间中的OpenGL纹理坐标

我正在开发一款使用OpenGL ES 2进行绘图的iPhone应用程序.我知道通常纹理坐标是在0-1范围内定义的,但理想情况下我想将它们从0-1023(我的TextureAtlas的大小)映射出来以便于阅读.我已经看到了以这种方式定义坐标的示例代码,但是无法确定以前允许这样做的调用.glMatrixMode(GL_TEXTURE)好像它可能涉及,但我不太确定如何实现它.

我的最终目标是完成这样的事情,我在地图册中使用的纹理位于左上角48px的正方形中:

GLshort texcoords[]={
  48,48,
  0,48,
  48,0,
  0,0,
};
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_SHORT, 0, 0, texcoords);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch opengl-es objective-c

15
推荐指数
3
解决办法
2万
查看次数

texelFetch的替代方案?

我正在进入GLSL并需要一些纹理查找帮助.我正在尝试使用纹理进行存储,但我无法获得"正确"的纹理查找.我更喜欢使用通常的texture2D方法(使用GLSL 1.2),但结果不够好.

使用texture2D: 一

使用texelFetch: 二

现在很明显第一个问题出了问题.这是我想要做的事情(是的尺寸是正确的,除非有一些我不知道的事情):

vec4 texelFetch(sampler2D tex, ivec2 size, ivec2 coord)
{
    return texture2D(tex, vec2(float(coord.x) / float(size.x), 
                               float(coord.y) / float(size.y)));
}
Run Code Online (Sandbox Code Playgroud)

那么,这将如何正确完成?

opengl glsl sfml

10
推荐指数
1
解决办法
9243
查看次数

GLSL纹理坐标到绝对像素?

我的问题是关于texturecoordinate如何精确地映射到纹理中的纹素(不考虑过滤).

(0,0)例如是参考左上角像素的左上角还是参考左上角像素的中心?

如果使用近滤波,在纹理坐标(0.5,0.5)处获取什么像素?

怎么样(1.0,1.0),它是指右下角像素的右下角还是右下角像素的左上角?(我记得几年前,一些ATI和NVIDIA卡之间存在差异.它现在是标准化的吗?)

如果使用texelFetch()而不是textureLod(),访问像素的正确方法是什么?

是吗

ivec2 size = textureSize(sampler,0);
ivec2 iCoords = ivec2(int(uv.x*size.x),int(uv.y*size.y));
vec4 col = texelFetch(sampler,iCoords);
Run Code Online (Sandbox Code Playgroud)

或者可能

ivec2 iCoords = ivec2(int(uv.x*size.x+0.5f),int(uv.y*size.y+0.5f));
Run Code Online (Sandbox Code Playgroud)

正确?

甚至

ivec2 iCoords = ivec2(int(uv.x*(size.x+1)),int(uv.y*(size.y+1)));
Run Code Online (Sandbox Code Playgroud)

也许有人可以澄清映射究竟是如何工作的?

opengl glsl texture-mapping uv-mapping

2
推荐指数
1
解决办法
1万
查看次数