3

openglの一部をwebglに移植していて、texture3dをエミュレートしようとしています。どういうわけか何かがうまくいかない。

計算にのみ使用されるため、補間は必要ありません。元のコードのジオメトリ部分についてはよくわかりません。レイヤーごとのプロパティがテクスチャを介してフェッチされるようになりました。

更新:わかりました、テクスチャ3d関数を書き直しましたが、まだいくつかの問題が発生しています:

const vec3 volumeTextureSize = vec3( 256.0, 128.0, 32.0 );
const vec2 imageSize = vec2( 1024.0, 1024.0 );

vec2 uvFromUvw( vec3 uvw ) {
    const vec3 size = volumeTextureSize;
    const vec2 layersPerDim = size.xy / imageSize.xy;
    const vec2 pixelsPerLayer = imageSize / layersPerDim;

    // normalized in
    float layer = floor(uvw.z * size.z);

    float layerX = mod(layer, layersPerDim.x);
    float layerY = floor(layer / layersPerDim.x);

    vec2 layerUv = vec2(layerX, layerY) * pixelsPerLayer;
    vec2 layerSpaceUv = (uvw.xy * size.xy) / layersPerDim;

    vec2 uv = layerSpaceUv + layerUv;

    uv /= imageSize;

    return uv;
}

vec4 texture3D( sampler2D tex, vec3 uvw ) {
    vec2 uv = uvFromUvw( uvw );
    return texture2D(tex, uv);
}

vec3 uvwFromUv( vec2 uv ) {
    const vec3 size = volumeTextureSize;
    const vec2 layersPerDim =  imageSize.xy / size.xy;
    const vec2 pixelsPerLayer = imageSize / layersPerDim;

    vec2 normUv = uv / imageSize;

    vec2 layerUv = floor(vec2(normUv * layersPerDim.xy));

    vec3 uvw = vec3(0.0);

    uvw.z = floor(layerUv.x + floor( layerUv.y * layersPerDim.x));
    uvw.xy = uv - (layerUv * pixelsPerLayer.xy);

    // normalized coords
    // uvw.xy /= size.xy;
    uvw.z /= layersPerDim.x * layersPerDim.y;

    return uvw;
}

これは私が移植したい元のコードです:

glActiveTexture(GL_TEXTURE0 + deltaJUnit);
glGenTextures(1, &deltaJTexture);
glBindTexture(GL_TEXTURE_3D, deltaJTexture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGB, GL_FLOAT, NULL);



    glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaJTexture, 0);

    for (int layer = 0; layer < RES_R; ++layer) {
        setLayer(jProg, layer);
        .. also set uniforms
        drawQuad();
    }

とglsl

#ifdef _VERTEX_

void main() {
    gl_Position = gl_Vertex;
}

#endif

#ifdef _GEOMETRY_
#extension GL_EXT_geometry_shader4 : enable

void main() {
    gl_Position = gl_PositionIn[0];
    gl_Layer = layer;
    EmitVertex();
    gl_Position = gl_PositionIn[1];
    gl_Layer = layer;
    EmitVertex();
    gl_Position = gl_PositionIn[2];
    gl_Layer = layer;
    EmitVertex();
    EndPrimitive();
}

#endif
4

0 に答える 0