题
我正在尝试使用着色器在球体上绘制很多圆圈。基本算法是这样的:
- 计算从片段(使用其纹理坐标)到圆心位置的距离(圆心也在纹理坐标中指定)
- 计算从线段到圆心的角度。
- 基于角度,访问纹理(其中有 360 像素,红色通道指定半径距离)并检索给定角度的半径
- 如果从片段到圆心的距离小于检索到的半径,则片段的颜色为红色,否则为蓝色。
我想画...比如说蓝色球体上有 60 个红色圆圈。我让 y 着色器适用于一个圆,但如何做到 60 个呢?这是我到目前为止所尝试过的......
我传入了一个指定给定角度半径的数据纹理,但我注意到伪影逐渐出现。我相信这是由于当我尝试使用以下方法从数据纹理检索信息时进行的线性插值:
float returnV = texture2D(angles, vec2(x, y)).r;
其中,angles 是包含给定角度半径的数据纹理 (Sampler2D),x = angle / 360.0(角度为 0 到 360),y = 0 到 60(y 是圆数)
我尝试传递统一浮点半径[360],但我无法使用动态索引访问半径。我什至尝试过这种混乱......
getArrayValue(int index) { if (index == 0) { return radii[0]; } else if (index == 1) { return radii[1]; }
等等 ...
如果我创建一个纹理并将所有圆圈放置在该纹理上,然后使用包含圆圈的球体对蓝色球体进行多重纹理处理,它会起作用,但正如您所期望的,我的锯齿效果非常糟糕。我喜欢根据片段的位置和圆的位置按程序生成圆的想法,因为几乎没有锯齿。不过,我做的矿石比我还多吗?
谢谢!!!
~博尔特
解决方案
我有一个在地形上制作圆圈的着色器。它通过鼠标移动而移动。也许你会得到灵感?
这是一个片段程序。它不是主程序,但您可以将其添加到您的程序中。尝试这个...
现在你可以在硬编码中给出一些统一的参数。
uniform float showCircle;
uniform float radius;
uniform vec4 mousePosition;
varying vec3 vertexCoord;
void calculateTerrainCircle(inout vec4 pixelColor)
{
if(showCircle == 1)
{
float xDist = vertexCoord.x - mousePosition.x;
float yDist = vertexCoord.y - mousePosition.y;
float dist = xDist * xDist + yDist * yDist;
float radius2 = radius * radius;
if (dist < radius2 * 1.44f && dist > radius2 * 0.64f)
{
vec4 temp = pixelColor;
float diff;
if (dist < radius2)
diff = (radius2 - dist) / (0.36f * radius2);
else
diff = (dist - radius2) / (0.44f * radius2);
pixelColor = vec4(1, 0, 0, 1.0) * (1 - diff) + pixelColor * diff;
pixelColor = mix(pixelColor, temp, diff);
}
}
}
并在顶点着色器中添加:
varying vec3 vertexCoord;
void main()
{
gl_Position = ftransform();
vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
}
其他提示
福福郡, ,如果将矩阵乘以它的逆矩阵,就可以得到恒等式。
你的;
vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
因此相当于
vertexCoord = vec3(gl_Vertex);
不隶属于 StackOverflow