我正在尝试使用着色器在球体上绘制大量圆圈。基本的alogrith是这样的:
我想绘制...在蓝色球体上说60个红色圆圈。我有一个shader工作一个圆圈,但怎么办60?这是我到目前为止所尝试的......
我传入了一个数据纹理,指定了给定角度的半径,但我注意到了神器蔓延。我相信这是由于线性插值,当我尝试使用以下方法从数据纹理中检索信息时: p>
float returnV = texture2D(angles, vec2(x, y)).r;
其中angle是包含给定角度半径的数据纹理(Sampler2D),x =角度/ 360.0(角度为0到360),y = 0到60(y是圆圈数)
我尝试传入Uniform float radius [360],但我无法通过动态索引访问半径。我甚至试过这个烂摊子......
getArrayValue(int index) {
if (index == 0) {
return radii[0];
}
else if (index == 1) {
return radii[1];
}
依旧......
如果我创建一个纹理并将所有圆圈放在该纹理上,然后将蓝色球体与包含圆圈的蓝色球体进行多重纹理,那么正如您所期望的那样,我的锯齿非常糟糕。我喜欢基于片段的位置和圆的位置来程序生成圆的想法,因为几乎没有锯齿。但是,我做的不是一个人吗?
THX !!!
〜螺栓
答案 0 :(得分: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);
}
答案 1 :(得分:0)
ufukgun,如果你通过反转多重矩阵,你就得到了身份
您的;
vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
因此等同于
vertexCoord = vec3(gl_Vertex);