我试图在片段着色器上设置Mandelbrot。我最初构建一个矩形,并使用gl_FragCoords来计算算法。这是代码:
#version 330 core
uniform float MaxIterations;
out vec4 pixelColor;
void main()
{
float real = gl_FragCoord.x;
float imag = gl_FragCoord.y;
float Creal = real;
float Cimag = imag;
float r2 = 0.0;
for (float iter = 0.0; iter < MaxIterations && r2 < 4.0; ++iter)
{
float tempreal = real;
real = (tempreal * tempreal) - (imag * imag) + Creal;
imag = 2.0 * tempreal * imag + Cimag;
r2 = (real * real) + (imag * imag);
}
vec3 color;
if (r2 < 4.0)
color = vec3(0.0f, 0.0f, 0.0f);
else
color = vec3(1.0f, 1.0f, 1.0f);
pixelColor = vec4(color, 1.0);
}
这段代码实际上是我在互联网上找到的简化版本。我假设y轴为虚轴,x轴为实部。然后我计算迭代直到统一通过最大值。它应该显示一个黑色和白色的矩形(在集合外部为白色,内部为黑色),但我只是得到一个白色矩形。有谁知道出了什么问题?
编辑:添加更多细节。 这是我用于矩形的顶点
GLfloat vertices[] = {
0.9f, 0.9f,
0.9f, -0.9f,
-0.9f, -0.9f,
-0.9f, 0.9f
};
这里是顶点着色器:
#version 330 core
layout (location = 0) in vec2 position;
void main() {
gl_Position = vec4(position, 0.0f, 1.0f);
}
答案 0 :(得分:2)
对于一个mandlebrot集,像素坐标有多大输入值吗?尝试从顶点着色器创建表示顶点坐标的新输出,并将其用作片段着色器中的输入:
layout (location = 0) in vec2 position;
out vec2 coord;
void main() {
gl_Position = vec4(position, 0.0f, 1.0f);
coord = position.xy
}
在片段着色器中:
#version 330 core
uniform float MaxIterations;
out vec4 pixelColor;
in vec2 coord;
void main()
{
float real = coord.x;
float imag = coord.y;
(...)