我编写了一个着色器,而不是通过高度贴图纹理转换顶点位置。因为几何体正在顶点着色器上进行变换,所以我不能在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像素高的纹理。我把图像着色为黑色,除了我染成红色的最后一个像素(408,434)。所以当我在JS中调用我的sampler函数时:
this.sample(imgData, 0.9999, 0.9999. wrapS, wrapT)
结果是1.对我来说,正确的是它引用了红色像素。
然而,这似乎不是GLSL给我的。在GLSL中,我使用它(作为测试):
float coarseHeight = texture2D( heightfield, vec2( 0.9999, 0.9999 ) ).r;
我希望roughHeight也应该是1 - 而不是它0.我不明白这个......有人能给我一些洞察我出错的地方吗?
答案 0 :(得分:1)
您可能已经注意到任何渲染的纹理都是镜像的。
OpenGL
并且WebGL
纹理原点位于左下角,当使用canvas 2d方法加载时,缓冲区数据具有左上角原点。
因此,您需要重写缓冲区或反转v
坐标。