我想获得一个着色器程序对象使用的所有制服和属性列表。 glGetAttribLocation()和glGetUniformLocation()可以用来映射一个string到一个位置,但我真正喜欢的是string列表,而不必分析glsl代码。 注意:在OpenGL 2.0中, glGetObjectParameteriv()被glGetObjectParameteriv()所取代。 枚举是GL_ACTIVE_UNIFORMS & GL_ACTIVE_ATTRIBUTES 。
我正在着色器pipe理器架构上工作,对于更高级的人员我有几个问题。 我目前的select反对两种devise: 1.每个材质着色器程序 =>为程序中使用的每种材质创build一个着色器程序。 潜在缺点: 考虑到每个对象可能有自己的材料,它涉及到很多glUseProgram调用。 意味着创build了许多shaderprogram对象。 更复杂的架构#2。 优点: 可以为材质中使用的每个“选项”专门生成着色器代码。 如果我没有错,那么制服只能被设置一次(当创build阴影程序时)。 2.全球着色器程序 =>为每个着色器function(闪电,reflection,视差映射…)创build一个着色器程序,并根据要渲染的材质使用configurationvariables启用或放弃选项。 潜在缺点: 制服必须每帧更换多次。 优点: 较低着色器程序计数。 减lessSP swich(glUseProgram)。 你可能会注意到我目前的倾向是#1,但是我想知道你对此的看法。 初始制服设置是否抵消了glUseProgram调用开销(我不是特别的速度怪胎)? 在情况1中,对于任何内存或性能的考虑,我应该在创buildSP时只调用一次glLinkProgram,或者每次调用glUseProgram时都必须取消链接/链接? 有更好的解决scheme吗? 谢谢!
哪个更好 ? 要有一个着色器程序有很多制服指定要使用的灯光或映射(例如,我需要一个网格是视差映射,另一个视差/镜面映射)。 如果需要的话,我会制作一个caching的制服清单,然后为每一个下一个网格制作一些制服。 为了每个需要的情况都有很多的着色器程序 ,每一个都有less量的制服,如果需要的话,为每个网格做glUseProgram的惰性绑定。 在这里,我假定网格是正确的批处理,以避免冗余交换机。
我正在为iOS编写一个3D应用程序。 我是OpenGL ES 2.0的新手,所以我仍然围绕着编写基本的着色器。 我真的需要根据纹理对我的一些模型实现“发光”效果。 这是一个示例: 。 我正在寻找OpenGL ES 2.0的代码示例。 我在网上find的大多数代码是桌面OpenGL或D3D。 有任何想法吗?
我知道过去几年也有类似的问题,但经过一番研究后,我仍然无法决定从哪里学到,应该学什么。 我也希望看到你现在使用更多C ++ OOP和着色器方法的现代OpenGL编程实际观点。 并确保我对某些事情的真正理解是有效的。 所以…目前我们有OpenGL 4.2,当我在某处读取需要dx11硬件(这是什么意思?)和一组“侧”库,例如创build窗口。 有最常见的GLUT,我非常讨厌。 主要原因之一是函数调用,它不允许我们创build主循环的方式自由。 正如有些人所说,这不是为了游戏。 也有GLFW,这实际上是相当不错,直截了当的我。 出于某种原因,人们将其与GLUT一起使用。 (它不仅提供窗口初始化,还提供其他实用程序?) 还有SFML和SDL(SDL <SFML IMO),但他们有时需要奇怪的方法来使用OGL,在某些情况下并不是很快。 我们也有GLEW,这是扩展加载实用程序…等待…不是GLUT / GLFW已经是一个扩展? 是否有任何理由使用它,像有什么非常重要的扩展名感兴趣? 直到现在我们有窗口创build(和一些实用程序),但是… OGL不负责加载纹理,不是3D模型。 我还需要多less个其他库? 现在让我们来提一下教育部分。 有(着名的)NeHe教程。 使用WinApi编写,代码非常不明确,过时的解决scheme,但仍然是最受欢迎的。 像红皮书等一些东西可以find,这与像2.x或3.x版本,但只有less数(和未完成)的教程提到4.x. 该怎么办?
最近,我一直在围绕着Shadertoy – https://www.shadertoy.com/ ,努力学习更多关于OpenGL和GLSL的知识。 从我目前所了解的情况来看,OpenGL用户首先必须准备好要使用的所有几何graphics,并configurationOpenGL服务器(光源数量,纹理存储等)。 一旦完成,用户必须在OpenGL程序编译之前至less提供一个顶点着色器程序和一个片段着色器程序。 但是,当我查看Shadertoy上的代码示例时,我只能看到一个着色器程序,并且大部分使用的几何graphics似乎直接写入GLSL代码。 这是如何运作的? 我的猜测是顶点着色器已经预先准备好了,可编辑/采样着色器只是一个片段着色器。 但是这并不能解释一些更复杂的例子中的几何。 任何人都可以解释Shadertoy是如何工作的?
我知道有一些关于学习OpenGL的问题。 这是我所知道的: math为3D 三维理论 这里是我想知道的: – OpenGL 4.0 核心configuration文件 (或后者) – 着色语言400(或后者) – 上面的每一部分(如果它不适用于供应商那么它仍然不打扰我) 这是我不想知道的 – 固定functionpipe道(不会使用它!) – 较旧的OpenGL的 – 兼容性configuration文件 我喜欢教程,系列文章,书籍等大部分信息。 PS如果你知道opengl 3.x核心configuration文件的资源,请发布它们
我一直在试图编写一个Marching Cubesalgorithm的双通道GPU实现,类似于使用OpenGL和GLSL的第一章GPU Gems 3。 然而,在我的第一遍调用glDrawArrays一贯失败,并有一个GL_INVALID_OPERATION 。 我查阅了所有可以find的文档,并发现了glDrawArrays可以抛出这个错误的条件: 如果非零缓冲区对象名称绑定到启用的数组或绑定到GL_DRAW_INDIRECT_BUFFER绑定并且当前映射缓冲区对象的数据存储区,则会生成GL_INVALID_OPERATION 。 如果在执行glBegin和相应的glEnd之间执行glDrawArrays则会生成GL_INVALID_OPERATION 。 如果当前程序对象中的任何两个活动采样器都是不同types的,则将由glDrawArrays或glDrawElements生成GL_INVALID_OPERATION ,但是指向相同的纹理图像单元。 如果几何着色器处于活动状态并且模式与当前安装的程序对象中的几何着色器的input基元types不兼容,则会生成GL_INVALID_OPERATION 。 如果模式是GL_PATCHES并且没有镶嵌控制着色器处于活动状态,则会生成GL_INVALID_OPERATION 。 如果将基元的顶点logging到用于变换反馈目的的缓冲区对象,则会产生GL_INVALID_OPERATION ,这会导致超出任何缓冲区对象的大小限制,或者超出由glBindBufferRange设置的结束位置offset + size – 1。 GL_INVALID_OPERATION由glDrawArrays()生成,如果不存在几何着色器,转换反馈处于活动状态,模式不是允许的模式之一。 GL_INVALID_OPERATION由glDrawArrays()生成,如果存在几何着色器,则变换反馈处于活动状态,几何着色器的输出基元types与变换反馈基元模式不匹配。 如果绑定的着色器程序无效,则会生成GL_INVALID_OPERATION 。 编辑10/10/12:如果正在使用变换反馈,并且绑定到变换反馈绑定点的缓冲区也绑定到数组缓冲区绑定点,则会生成GL_INVALID_OPERATION 。 这是我遇到的问题,由于我绑定了哪个缓冲区的拼写错误。 虽然规范声明这是非法的,但在我发现的任何文档中,glDrawArrays都没有列出它作为抛出错误的原因之一。 不幸的是,没有一个官方文档可以find涵盖3个以上的官方文档。 我不得不从很多来源收集这个清单。 第7和第8点实际上来自glBeginTransformFeedback的文档,第9点似乎没有logging。 我发现它在某个论坛post中提到。 不过,我还是不认为这个清单是完整的,因为这些清单似乎都不能解释我得到的错误。 我在任何地方都没有在程序中映射任何缓冲区。 我正在使用核心configuration文件,所以glBegin和glEnd甚至不可用。 我有两个采样器,他们是不同的types,但他们肯定映射到不同的纹理。 几何着色器是活动的,但是它的input布局是layout (points) in , glDrawArrays是用GL_POINTS调用的。 我没有使用任何types的GL_PATCHES或镶嵌着色器。 我确定我正在分配几何着色器可能输出的最大空间量。 然后我尝试了四倍。 没有帮助。 有一个几何着色器。 看下一点。 正在使用变换反馈,并且有一个几何着色器,但是输出布局是layout (points) out , glBeginTransformFeedback是用GL_POINTS调用的。 […]
过去几周我一直在学习OpenGL,而且在实现Phong着色器时遇到了一些麻烦。 尽pipe我使用了smooth限定符,但似乎在顶点之间没有插值。 我在这里错过了什么? 为了在信用到期时提供信用,顶点和片段着色器的代码严重依赖于OpenGL SuperBible第五版。 我会强烈推荐这本书! 顶点着色器: #version 330 in vec4 vVertex; in vec3 vNormal; uniform mat4 mvpMatrix; // mvp = ModelViewProjection uniform mat4 mvMatrix; // mv = ModelView uniform mat3 normalMatrix; uniform vec3 vLightPosition; smooth out vec3 vVaryingNormal; smooth out vec3 vVaryingLightDir; void main(void) { vVaryingNormal = normalMatrix * vNormal; vec4 vPosition4 = mvMatrix […]
问题(TL; DR) 我的问题从根本上说是我不知道OpenGL ES 2.0如何期望我编写和使用多个着色器; 或者甚至是可取的/预计一个人会这样做。 这里的基本问题是:如果我有一个苹果,一个发光的岩石和一个模糊的网格,都在同一个3D世界,所有最好的绘制与不同的着色器程序,但使用相同的mvpMatrix,那么我将如何去使用所有这些相同的OpenGL渲染,使他们都使用我写的最合适的着色器? 我做了什么 所以我已经为我的Android游戏编写了一个基本的OpenGL ES 2.0程序,它完美地工作,可以将对象的轮廓绘制到屏幕上。 但是别的什么都没有。 非常多,因为着色器看起来像这样: 顶点着色器 uniform mat4 uMVPMatrix; attribute vec4 aPosition; void main() { gl_Position = uMVPMatrix * aPosition; } 片段着色器 void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } 现在他们是非常基本的。 我之所以没有走得更远,是因为我不知道是否应该写一个着色器来应用于所有不同的对象,或者我应该使用多个着色器。 如果我应该使用多个着色器来绘制多个不同的对象,那么我怎样才能以一种有效的方式去做呢? 我觉得这对OpenGL ES 2.0日日夜夜的人来说一定是基本的知识,所以我希望有人能回答我的问题,或者指出我的方向是正确的。 我有: 看了多个教程; 没有一个使用除了最基本的着色器之外的任何东西。 阅读整个OpenGL ES 2.0 GLSL规范(没有提到它是如何使用的;它只是做了什么,而不是它如何组合在一起)。 试图修改我的着色器了一下。 所以我希望我接近了解OpenGL的工作stream程,但我似乎还没有在那里。 […]