【发布时间】:2013-12-05 03:23:10
【问题描述】:
使用纹理,我试图将数据传递给我的着色器,以便它知道每个片段应该是什么颜色。我正在尝试使用 8 位整数创建体素类型的地形(Minecraft 风格体素),每个 RGBA 值都是在着色器上指定的不同颜色。例如,值 1 可能是绿色,而 2 可能是棕色。
如果我的数学是正确的,2048 x 2048 大小的纹理就是体素地形数据所需的确切大小:
2048 x 2048 大小的纹理 = 4194304 像素。
8 x 8 = 64 个“块”一次加载。
一个块中有 32 x 32 x 256 = 262144 个体素。
64 x 262144 = 16777216 体素。
对于纹理中的每个像素,我可以使用 RGBA 作为单独的值,因此将其除以 4:(因此每个体素为 1 个字节,因为值将小于 200。)
16777216 / 4 = 4194304 像素。
也就是说,我无法获得正确的纹理坐标来表示 3D 地形。这是我目前适用于平面的代码:
片段着色器:
int modint( int a, int b )
{
return a - int( floor( float( a ) / float( b ) ) * float( b ) );
}
void main() {
// divide by 4096 because we're using the same pixel twice in each axis
vec4 data = texture2D(uSampler, vec2(verpos.x / 4096.0, verpos.z / 4096.0));
vec2 pixel_of_target = verpos.xz;
int _x = int( pixel_of_target.x );
int _y = int( pixel_of_target.y );
int X = modint( _y, 2 ) * 2 + modint( _x, 2 );
vec4 colorthing;
float blockID;
if (X == 0) blockID = data.x;
else if (X == 1) blockID = data.y;
else if (X == 2) blockID = data.z;
else if (X == 3) blockID = data.w;
if (blockID == 1.0) gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
else if (blockID == 2.0) gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 );
else if (blockID == 3.0) gl_FragColor = vec4( 0.0, 0.0, 1.0, 1.0 );
else if (blockID == 4.0) gl_FragColor = vec4( 1.0, 0.0, 1.0, 1.0 );
}
所以基本上我的纹理是一个包含我的 3D 数据切片的 2D 贴图,我需要修改此代码以便计算正确的坐标。有人知道我会怎么做吗?
【问题讨论】:
标签: opengl-es textures glsl webgl shader