处理中几何着色器的意外行为

2023-12-11

我在处理中使用简单的几何着色器:

shader(shader);
  
beginShape();
   vertex(0.1, 0.1);
   vertex(0.0, 0.0);
   vertex(0.001, 0.02);
endShape();

所以我在三角形上应用着色器。

我们首先有一个不执行任何操作的简单顶点着色器。

in vec4 position;
 
void main() {
  gl_Position = position;
}

然后我们有几何着色器,它应该为每个输入顶点返回一个顶点,所以总共 3 个顶点。

#version 150

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
 
out FragData {
  vec4 color;
} FragOut;
 
void main(){

  for(int i=0; i<gl_in.length(); i++){
    if(i%3==0){
      FragOut.color = vec4(1., 0., 0., 1.);
    }else if(i%3==1){
      FragOut.color = vec4(0., 1., 0., 1.);
    }else if(i%3==2){
      FragOut.color = vec4(0., 0., 1., 1.);
    }
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }
  
  EndPrimitive();
}

最后,我们有一个不执行任何操作的简单片段着色器:

#version 150

in FragData {
  vec4 color;
} FragIn;

out vec4 fragColor;

void main() {
  fragColor = FragIn.color;
}

结果应该是一个三角形,每个顶点具有不同的颜色。但结果是四个三角形,我不知道为什么。

Here's the result


绘制形状时,不仅绘制填充多边形,还绘制轮廓(stroke)。通过调用禁用绘制轮廓noStroke().

完整示例:

PShader shader;

void settings() {
    size(300, 300, P2D);
}

void setup() {
    shader = new GeometryShader(this, "Vertex.glsl", "Geometry.glsl", "Fragment.glsl");
}

void draw() {
    background(128);  
    
    noStroke();     // <-- this is important
    shader(shader);
    
    beginShape();
        vertex(-0.5, -0.5);
        vertex( 0.5, -0.5);
        vertex( 0.5,  0.5);
    endShape();
}

void keyPressed(){
    saveFrame();
}

为了课程的完整性GeometryShader:

import com.jogamp.opengl.GL3;

class GeometryShader extends PShader {
  int glGeometry;
  String geometrySource;

  GeometryShader(PApplet parent, String vertFilename, String geoFilename, String fragFilename) {
    super(parent, vertFilename, fragFilename);
    geometrySource = PApplet.join(parent.loadStrings(geoFilename), "\n");
  }

  // Setup the geometry shader (fragment and vertex shaders are automatically handled in 
  // by the PShader superclass).
  void setup() {
    glGeometry = pgl.createShader(GL3.GL_GEOMETRY_SHADER);
    pgl.shaderSource(glGeometry, geometrySource);
    pgl.compileShader(glGeometry);

    pgl.getShaderiv(glGeometry, PGL.COMPILE_STATUS, intBuffer);
    boolean compiled = intBuffer.get(0) == 0 ? false : true;
    if (!compiled) {
      println("Cannot compile geometry shader:\n" + pgl.getShaderInfoLog(glGeometry));
      return;
    }
    
    pgl.attachShader(glProgram, glGeometry);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理中几何着色器的意外行为 的相关文章

  • 计算边界球体半径时遇到一些问题

    我已经设法用两种方法计算边界球体半径 但没有一种方法能够准确地满足我的要求 我不需要 像素 完美边界球 但我想要比我目前拥有的更好的东西 我正在使用 Wavefront obj 模型并计算这些模型的边界球半径 我提取当前模型尺寸 我使用 N
  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • 对 VBO 中的特定三角形使用不同的纹理

    我有 9 个由三角形组成的四边形 如下所示 我在用着VBO存储有关它们的数据 它们的位置和纹理坐标 我的问题是 是否可以仅使用一个来使四边形 5 具有与其余四边形不同的纹理VBO and shader 绿色代表纹理 1 黄色代表纹理 2 到
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • WebKit 是否使用 OpenGL 来渲染 CSS 过渡?

    WebKit 是使用 OpenGL 来渲染 CSS 过渡 还是使用软件渲染 WebKit 只是一个前端 这取决于后端和硬件支持 谷歌浏览器使用skia http code google com p skia 作为后端 它可以使用软件或硬件
  • 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

    我的应用程序链接到这些框架 Cocoa Framework AppKit Framework CoreData Framework Foundation Framework 请注意 OpenGL Framework 是NOT已链接 但是 设
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率

随机推荐

  • 多线程 C 程序中的线程 ID 错误?

    我是 C 多线程新手 我有这个问题 我写了以下代码 include
  • 如何使用 JavaScript 改变网页上的字母颜色?

    我正在尝试使用 javascript 更改网页上特定 div 中每个字母的颜色 我在论坛上发现了这个脚本 它使用表单选择来交替 div 单词的颜色
  • 具有 netTcpBinding 和证书传输安全性的 WCF

    我需要保护使用 netTcpBinding 并直接与基于 Windows 窗体的应用程序连接的 WCF 服务 我只需要它在传输层得到保护 我很确定我可以在本地运行该服务 即我可以在本地运行该服务 并与客户端连接到它 当我尝试设置服务以使其在
  • cURL 登录 HTTPS 站点

    我一直在尝试使用 cURL 和 PHP 将登录凭据发布到 https 站点 但没有成功 对于不安全的网站来说一切正常 但我无法通过 https 获得它 我知道我发布的标题详细信息是正确的 尽管我为了这个示例而模拟了它们 请帮忙
  • 如何将 SchemaExportTool 与 JPA 和 Hibernate 4.3 结合使用

    在 Hibernate 4 3 中 Ejb3Configuration 类被删除 此类通常用于从持久性单元 persistence xml 文件 到 SchemaExport 工具创建 hibernate 配置文件 作为将架构导出到 sql
  • 从简单的 FireBase 数据库读取

    我在读取 Firebase 数据库时遇到一些问题 我有一个非常简单的布局 lot lot1 low lot2 low lot3 low 当然 MyAppName 高于这一切 FirebaseDatabase database Firebas
  • 如何在一次查询中检索多个数据 Firebase

    我是 firebase 和 nosql 的新手 我遵循了数据结构化指南 这是我的数据的样子 Guardians jojo pti gros KBT2ui6wlC6Fgk1c7Xa creationDate 2016 02 26 15 50
  • 在 Linux 上使用 fgets() 读取带有 DOS 行结尾的文件

    我有一个在运行时收到的带有 DOS 行结尾的文件 因此我无法将行结尾转换为 UNIX 样式脱机 另外 我的应用程序可以在 Windows 和 Linux 上运行 我的应用程序做了一个fgets 文件并尝试逐行读取 Linux 上每行读取的字
  • Oracle 中的外键约束问题

    在 Oracle 9i 中声明 FK 时遇到问题 我在 SO 和一些在线文档中查看了许多示例 例如http www techonthenet com oracle foreign keys foreign delete php 没有任何真正
  • 如何找出ClearCase视图加载的文件在哪里?

    我们使用 ClearCase UCM 和 base 我们面临的悬而未决的问题之一是 如何通过给定的视图存储目录路径找出快照视图的加载文件所在的位置 例如我们的景观位于C views myview vws 有时 等效加载的文件位于C view
  • ZF2 + Doctrine2:服务器已消失 - 如何启动旧连接?

    在此先感谢您的帮助 我想知道是否有人很快知道在实体存储库死机时要调用哪些函数来重新连接 我正在通过 ZF2 CLI 路由运行一些作业 这些作业可能需要超过 wait timeout 的时间 不幸的是 ER 的连接在需要使用时 作业完成时 就
  • UILocalNotification重复声音

    我使用了此页面中苹果示例的代码 Link 但我似乎无法让声音重复 我检查了其他应用程序 例如 Skype 用于 VOIP 和 Alarm Clock Pro 音频 但我无法重复播放声音文件 这是我的代码 void applicationDi
  • Windll ctypes 从 python 2.7 调用可变参数 c 函数在 win64 中有效,但在 win32 中无效

    我在 Windows 10 32 和 Windows 10 64 上使用 Python 2 7 我正在为 C 编译的 stdcall Windows DLL mydll 编写一个 python 包装器 我有 2 个版本的 DLL 32 位和
  • 是否可以使 wget 的进度条适应多个文件?

    我通过执行或多或少的操作来下载某些目录的所有 htm 文件 wget http some url r accept htm nv show progress 其中我关闭了 wget 的打印 但保留了进度条 这对我的情况很有用 nv show
  • C++/CLI - 如何打开新表单并返回

    我正在创建一个应用程序 其中前端必须是使用 C CLI 的 Windows 窗体 该表格用于登录目的 在我的表单中 我有一个注册按钮 单击此按钮后 应打开一个新表单 关闭登录表单 我能够通过以下代码实现这一目标 Form rgForm gc
  • C++ 对命名空间中函数的未定义引用

    这已经困扰我一段时间了 我有一个命名空间 在该命名空间中我想声明 C 风格的函数 所以我做了我认为正确的事情 namespace test std deque
  • javaFX:MediaPlayer的seek方法挂起播放器,没有错误消息或状态更改

    我有一个带有 8 个媒体播放器的程序 它们像一个大视频一样通过一组控件进行控制 我有一个滑块来控制时间 也就是我调用所有 MediaPlayerseek中的方法onMouseReleased滑块的 我的问题是 媒体播放器一直挂起 没有改变其
  • JTable 的单元格渲染器 - 彩色行

    我一直在寻找解决方案 但在不问我自己的问题的情况下 我无法从各个地方了解如何让我的桌子进行彩色行 从我看过的每个地方我收集到我需要使用单元格渲染器 但问题是我不知道如何将其应用到我自己的情况 因此 我有一个包含 3 列的简单 JTable
  • 在哪里可以找到 Java 平方根函数的源代码? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我知道Math sqrt来电StrictMath sqrt double a 方法签名在StrictMath班级 public static nat
  • 处理中几何着色器的意外行为

    我在处理中使用简单的几何着色器 shader shader beginShape vertex 0 1 0 1 vertex 0 0 0 0 vertex 0 001 0 02 endShape 所以我在三角形上应用着色器 我们首先有一个不