c++ - 使用几何着色器实现裁剪平面?

标签 c++ qt opengl geometry-shader

我在使用什么:Qt 5.11.1、MinGW 5.3、Windows 10、C++11、GPU:NVidia 820M(支持 OpenGL 4.5)

我的任务: 我有非实体(只是表面)对象,由 glDrawArrays 渲染,我需要按平面获取该对象的横截面。我发现了古老的 openGL 函数 glClipPlane,但它与 VAO 和 VBO 不兼容。我还发现可以通过几何着色器重写 glClipPlane。

我的疑问/问题:

  1. 你知道实现这个任务的其他方法吗?

  2. 我真的不明白,如何在QtCreator中添加几何着色器,没有几何着色器的“图标”,我尝试添加顶点着色器并将其重命名为.gsh或只是.glsl,尝试使用QOpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::Geometry, QString &source) 并在程序中编写着色器代码,但每次我在添加几何着色器的字符串上得到“QOpenGLShader:无法创建着色器”。

将着色器添加到程序中的样子

screenshot

顶点着色器:

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;

}    

最佳答案

我们先来理清几个误区:

have found ancient openGL function glClipPlane, but its not compability with VAOs and VBOs.

这是不正确的。用户通过 glClipPlane 定义的裁剪平面在现代 GL 中确实已弃用,并已从核心配置文件中删除。但是,如果您使用它们仍然存在的上下文,则可以毫无问题地将它们与 VAO 和 VBO 组合。

Also Ive found out that its possible to rewrite glClipPlane via geometry shader.

自定义裁剪平面不需要几何着色器。

用户定义裁剪平面的现代方法是计算gl_ClipDistance对于每个顶点。虽然您可以在几何着色器中修改此值,但您也可以直接在顶点着色器中生成它。如果您不需要几何着色器,绝对没有理由只为裁剪平面添加它。

I really dont understand, how to add geometry shader in QtCreator, there is no "icon" of geometry shader, I tried to add vertex shader and rename it to .gsh or just .glsl, tried to use OpenGLShaderProgram::addShaderFromSourceCode(QOpenGLShader::Geometry, QString &source) and write shader code in program, but every time I get "QOpenGLShader: could not create shader" on string with adding geometry shader.

您首先需要找出您实际使用的 OpenGL 版本。使用 Qt,您可以轻松地获得 OpenGLES 2.0 上下文(取决于您创建上下文的方式,以及您的 Qt 的编译方式)。您的着色器代码是桌面 GL 2.x (GLSL 1.10/1.20) 或 GLES 2.0 (GLSL 1.00ES),但在 OpenGL 的现代核心配置文件中无效。

GLES2 根本不支持几何着色器。它也不支持gl_ClipDistance,所以如果你_really) 必须使用GLES2,你可以尝试emulate the clipping in the fragment shader .但更好的选择是切换到现代核心配置文件 GL 上下文。

关于c++ - 使用几何着色器实现裁剪平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406431/

相关文章:

c++ - 用户定义的类序列化、C++ 和 msgpack

Qt ComboBox->addItem() Integer to Qstring 转换错误?

objective-c - 返回 C 结构数组

c++ - 无法在 visual studio 2012 的 opengl 中绘制

c++ - 检查格式并使用 sscanf c++ 获取数字

c++ - 简单的 C++ SFML 程序高 CPU 使用率

c++ - 如何在qt中使用QImage和QPainter将两张图片合二为一?

windows - 部署时 QSoundEffect 不播放声音

visual-studio-2010 - 将 GLEW 与 Visual Studio 链接时出现问题

python - Qt5{.2.1,.2.0} OSX Mavericks 上的渲染问题 - 是什么原因造成的,如何解决?