问题描述
我已经在OpenGL中制作了一个小程序来绘制Mandelbrot set,但是在片段着色器中使用64位值时遇到了一些麻烦。当我像这样在着色器中使用vec2
类型并在c ++中为顶点数组添加双精度数组时,一切都会按预期进行:
#shader vertex
#version 410 core
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_colour;
layout(location = 2) in vec2 mandelbrot;
smooth out vec3 frag_colour;
smooth out vec2 frag_mandelbrot;
uniform float view_zoom;
uniform vec2 view_translate;
void main()
{
gl_Position = a_position;
frag_colour = a_colour;
frag_mandelbrot = (mandelbrot / view_zoom) + view_translate;
};
#shader fragment
#version 410 core
layout(location = 0) out vec3 colour;
in vec3 frag_colour;
in vec2 frag_mandelbrot;
void main()
{
double x = 0;
double y = 0;
vec3 start = vec3(0.0f,0.0f,0.0f);
vec3 end = vec3(1.0f,1.0f,1.0f);
int iteration = 0;
int max_iteration = 250;
while (x*x + y * y <= 2 * 2 && iteration < max_iteration) {
double xtemp = x * x - y * y + frag_mandelbrot[0];
y = 2 * x*y + frag_mandelbrot[1];
x = xtemp;
iteration++;
}
float t = float(iteration) / float(max_iteration);
colour = mix(start,end,t);
};
但是,当我尝试使用dvec2类型时:
#shader vertex
#version 410 core
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_colour;
layout(location = 2) in dvec2 mandelbrot;
smooth out vec3 frag_colour;
smooth out dvec2 frag_mandelbrot;
uniform double view_zoom;
uniform dvec2 view_translate;
void main()
{
gl_Position = a_position;
frag_colour = a_colour;
frag_mandelbrot = (mandelbrot / view_zoom) + view_translate;
};
#shader fragment
#version 410 core
layout(location = 0) out vec3 colour;
in vec3 frag_colour;
in dvec2 frag_mandelbrot;
void main()
{
double x = 0;
double y = 0;
vec3 start = vec3(0.0f,t);
};
我的碎片着色器中出现以下编译错误:
我的问题是,为什么它应该平坦? GLSL文档指出以下内容:
“注意:GLSL中的精确限定符支持与OpenGL ES兼容。它们使用与ES限定符相同的语法,但没有功能效果。除非希望着色器与ES兼容,否则不要使用它们。”
因此,我认为这些(highp,mediump等)不用于普通的台式机opengl。碎片着色器是否不可能将从顶点属性插入的64位值用作输入?还是我只是在某个地方犯了一些愚蠢的错误?
解决方法
片段着色器输入的类型
in dvec2 frag_mandelbrot;
是双精度浮点类型。
请参阅最新的GLSL规范OpenGL Shading Language 4.60 Specification (HTML) - 4.3.3. Constant Expressions
[...]
包含或包含整数或双精度浮点类型的片段着色器输入必须使用插值限定符flat进行限定。
[...]