【发布时间】:2018-12-26 15:13:26
【问题描述】:
我在用什么: Qt 5.11.1、MinGW 5.3、Windows 10、C++11、GPU:NVidia 820M(支持 OpenGL 4.5)
我的任务:我有非实体(只是表面)对象,由 glDrawArrays 渲染,我需要通过平面获取该对象的横截面。我发现了古老的 openGL 函数 glClipPlane,但它与 VAO 和 VBO 不兼容。我还发现可以通过几何着色器重写 glClipPlane。
我的疑问/问题:
您知道实现此任务的其他方法吗?
我真的不明白,如何在QtCreator中添加几何着色器,没有几何着色器的“图标”,我尝试添加顶点着色器并将其重命名为.gsh或只是.glsl,尝试使用@ 987654323@ 并在程序中编写着色器代码,但每次我在添加几何着色器的字符串上得到“QOpenGLShader:无法创建着色器”时。
在程序中添加着色器的样子
顶点着色器:
layout (triangles) in;
layout (triangles) out;
layout (max_vertices = 3) out;
void main()
{
int i;
for (i = 0; i < gl_in.length(); i++)
{
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
几何着色器:
layout (triangles) in;
layout (triangles) out;
layout (max_vertices = 3) out;
void main()
{
int i;
for (i = 0; i < gl_in.length(); i++)
{
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
片段着色器:
precision mediump float;
uniform highp float u_lightPower;
uniform sampler2D u_texture;
uniform highp mat4 u_viewMatrix;
varying highp vec4 v_position;
varying highp vec2 v_texCoord;
varying highp vec3 v_normal;
void main(void)
{
vec4 resultColor = vec4(0.25, 0.25, 0.25, 0.0);
vec4 diffMatColor = texture2D(u_texture, v_texCoord);
vec3 eyePosition = vec3(u_viewMatrix);
vec3 eyeVect = normalize(v_position.xyz - eyePosition);
float dist = length(v_position.xyz - eyePosition);
vec3 reflectLight = normalize(reflect(eyeVect, v_normal));
float specularFactor = 1.0;
float ambientFactor = 0.05;
vec4 diffColor = diffMatColor * u_lightPower * dot(v_normal, -eyeVect);// * (1.0 + 0.25 * dist * dist);
resultColor += diffColor;
gl_FragColor = resultColor;
}
【问题讨论】:
标签: c++ qt opengl geometry-shader