在Javascript中模拟texture2D

在Javascript中模拟texture2D,javascript,opengl-es,webgl,Javascript,Opengl Es,Webgl,我写了一个着色器,它通过heightmap纹理变换顶点位置。因为几何体是在顶点着色器上变换的,所以我不能在javascript中使用传统的拾取算法,而不对着色器进行反向工程,以将顶点转换到其变换的位置。我对GLSL中的texture2D函数的理解似乎有问题。如果忽略纹理环绕,您将如何在JS中模拟相同的功能?我现在就是这样做的: /** * Gets the normalized value of an image's pixel from the x and y coordin

我写了一个着色器,它通过heightmap纹理变换顶点位置。因为几何体是在顶点着色器上变换的,所以我不能在javascript中使用传统的拾取算法,而不对着色器进行反向工程,以将顶点转换到其变换的位置。我对GLSL中的texture2D函数的理解似乎有问题。如果忽略纹理环绕,您将如何在JS中模拟相同的功能?我现在就是这样做的:

    /**
    * Gets the normalized value of an image's  pixel from the x and y coordinates. The x and y coordinates expected here must be between 0 and 1
    */
    sample( data, x, y, wrappingS, wrappingT )
    {
        var tempVec = new Vec2();

        // Checks the texture wrapping and modifies the x and y accordingly
        this.clampCoords( x, y, wrappingS, wrappingT, tempVec );

        // Convert the normalized units into pixel coords
        x = Math.floor( tempVec.x * data.width );
        y = Math.floor( tempVec.y * data.height );

        if ( x >= data.width )
            x = data.width - 1;
        if ( y >= data.height )
            y = data.height - 1;

        var val= data.data[ ((data.width * y) + x) * 4 ];

        return val / 255.0;
    }
这个函数似乎产生了正确的结果。我有一个409像素宽434像素高的纹理。我将图像涂成黑色,但最后一个像素涂成红色(408434)。因此,当我在JS中调用我的采样器函数时:

this.sample(imgData, 0.9999, 0.9999. wrapS, wrapT)
结果是1。这对我来说是正确的,因为它指的是红色像素

然而,这似乎不是GLSL给我的。在GLSL中,我使用以下内容(作为测试):


我希望它的高度也应该是1,但它应该是0。我不明白这个。。。有人能告诉我哪里出了问题吗?

您可能已经注意到任何渲染纹理都是y镜像的

OpenGL
而且
WebGL
纹理原点位于左下角,当使用画布2d方法加载时,缓冲区数据具有左上角原点

因此,您需要重写缓冲区或反转
v
coord

float coarseHeight = texture2D( heightfield, vec2( 0.9999, 0.9999 ) ).r;