Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es 计算三维地形的正确纹理坐标_Opengl Es_Textures_Glsl_Webgl_Shader - Fatal编程技术网

Opengl es 计算三维地形的正确纹理坐标

Opengl es 计算三维地形的正确纹理坐标,opengl-es,textures,glsl,webgl,shader,Opengl Es,Textures,Glsl,Webgl,Shader,使用纹理,我试图将数据传递给着色器,以便它知道每个片段应该是什么颜色。我正在尝试使用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个体素 对

使用纹理,我试图将数据传递给着色器,以便它知道每个片段应该是什么颜色。我正在尝试使用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贴图,我需要修改这个代码,以便它计算正确的坐标。有人知道我会怎么做吗?

假设您的纹理将在8x8栅格中包含64个地形切片,以下查找应该可以工作:

vec2 texCoord = vec2((verpos.x / 8.0 +   mod(verpos.y, 8.0)) / 4096.0,
                     (verpos.x / 8.0 + floor(verpos.y / 8.0)) / 4096.0));
vec4 data = texture2D(uSampler, texCoord);
... Rest of your shader as above
然后,纹理应该在高度0处包含完整的2D地形切片,然后在其旁边的高度1处包含一个切片,直到最右侧位置的高度7为止。下一排是高度8-15,依此类推


话虽如此,您通常应该尽量避免着色器代码中的
if
s,因为这会大大降低着色器处理的速度。如果webGL支持数组(据我所知,它支持数组),则可以将所有颜色存储在一个数组中,并执行数组查找,而不是使用
If
-chain

纹理坐标

vec4 data = texture2D(uSampler, vec2(verpos.x / (4 * 2048.0), verpos.z / 2048.0));
然后要读取的字节将由

int index = (verpos.x/2048) % 4;

if index == 0 pick data.r, if 1 data.g, if 2 data.b and so on...