我正在创建2D纹理,如下所示:
GLuint t[1] = { 0 };
glGenTextures( 1, t );
ASSERT( t[0] > 0 );
glBindTexture( GL_TEXTURE_2D, t[0] );
CHECK_OGL
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
CHECK_OGL
...
glTexImage2D
(
GL_TEXTURE_2D,
0,
GL_R16F,
sz,
sz,
0,
GL_RED,
GL_FLOAT,
img
);
CHECK_OGL
然后在片段着色器中,我对-6,-6到6,6范围内的纹理进行大致采样。
但是,我观察到固定的纹理像素值,不再重复。
如果我通过在GLSL顶点着色器中添加一个fract()
操作来明确地重复,那么我确实会看到纹理重复,但是考虑到WRAP模式,为什么采样器不自己做呢?
顶点着色器:
...
out vec2 UV;
void main()
{
...
UV = fract( vec2( inPos.x, inPos.z ) );
//UV = vec2( inPos.x, inPos.z );
片段着色器:
...
in vec2 UV;
out vec4 outCol;
uniform sampler2D c_noiseSampler;
void main()
{
float sample = texture( c_noiseSampler, UV ).r;
...
即使没有fract()
,没有GL_REPEAT
的纹理也不会重复,只是夹住。
为什么纹理不会重复。是因为GL_R16F之类的FLOAT纹理不支持这种包装吗?
我在使用nVidia GPU的Ubuntu LTS:
GL_RENDERER GeForce GTX 1650/PCIe/SSE2
GL_VERSION 3.3.0 NVIDIA 430.14
GL_SHADING_LANGUAGE_VERSION 3.30 NVIDIA via Cg compiler