在片段着色器中绘制球体法线贴图

时间:2018-11-12 23:13:58

标签: glsl webgl

我正在尝试使用GL_POINTS在片段着色器中绘制一个具有法线贴图的简单球体。目前,我只是在屏幕上绘制一个点,然后应用片段着色器对其进行“球形化”。

但是,我在为球体正确上色时遇到了麻烦(或者至少我认为是)。看来我正确地计算了z值,但是当我将{normal}颜色应用到foo :: Int -> Int -> Int foo _ 0 = 0 foo a b = (a + 1) + foo (a + 1) (b - 1) 时,它看起来不太正确(或者这是从法线贴图可以期望的吗?)。我假设gl_PointCoord和片段坐标之间有些不一致,但是我不太清楚。

顶点着色器

gl_FragColor

片段着色器

precision mediump float;

attribute vec3 position;

void main() {
  gl_PointSize = 500.0;
  gl_Position = vec4(position.xyz, 1.0);
}

实际输出:

enter image description here

预期输出:

enter image description here

2 个答案:

答案 0 :(得分:1)

颜色通道固定在[0,1]范围内。 (0,0,0)为黑色,(1,1,1)为完全白色。

由于法向向量已归一化,因此其分量在[-1,1]范围内。 为了获得预期的结果,您必须将法线向量从[-1,1]映射到[0,1]:

vec3 normal_col = normalize(position) * 0.5 + 0.5;
gl_FragColor    = vec4(normal_col, 1.0);

如果使用abs值,则大小相同的正负值将具有相同的颜色表示。颜色的强度随值的渐变而增加:

vec3 normal_col = abs(normalize(position));
gl_FragColor    = vec4(normal_col, 1.0);

答案 1 :(得分:0)

首先,面向相机[0,0,-1]的法线应该是rgb值:[0.5,0.5,1.0]。您必须重新调整比例,才能将这些负值移动到01之间。

第二,球体的法线不会线性变化,而是正弦波。因此,这里需要一些三角函数。从垂直法线[0,0,-1]开始,然后再旋转该法线一个角度对我来说很有意义,因为 angle 是线性变化的。

通过玩这个游戏,我想到了:

http://glslsandbox.com/e#50268.3

使用以下旋转功能:https://github.com/yuichiroharai/glsl-y-rotate