因此,从到目前为止的尝试来看,我认为 GLSL 几何着色器在输入顶点由投影/模型视图矩阵转换后才起作用。换句话说,几何着色器在剪辑坐标上处理事物。
如果我要使用几何着色器将 GL_POINTS 转换为由 制成的立方体,该怎么办GL_TRIANGLES?在剪辑坐标上计算事物时,生成的形状似乎总是面向您/忽略旋转/缩放等。
此外,似乎GL_TRIANGLES不支持将其作为可能的几何输出类型之一。但无论如何我都尝试过,而且似乎有效。我想这取决于显卡?GL_TRIANGLES如果不支持,是否可以制作立方体?也许可以在空间之间制作零宽度的三角形条?
我试图让一些简单的漫射光在GLSL中工作.我有一个正在作为点数组传入的立方体,我正在计算几何着色器中的面法线(因为我打算在运行时使网格变形,所以我需要新的面法线.)
我的问题是当我将相机移动到世界各地时,漫反射值会发生变化.所以当我的立方体的脸上的阴影随着相机移动而改变.我无法弄清楚造成这种情况的原因.我的着色器如下:
顶点:
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
}
Run Code Online (Sandbox Code Playgroud)
几何:
#version 330
precision highp float;
layout (triangles) in;
layout (triangle_strip) out;
layout (max_vertices = 3) out;
out vec3 normal;
uniform mat4 MVP;
uniform mat4 MV;
void main(void)
{
for (int i = 0; i < gl_in.length(); i++) {
gl_Position = gl_in[i].gl_Position;
vec3 U = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 V = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
normal.x = (U.y …Run Code Online (Sandbox Code Playgroud) 我目前有一些 VAO 和一个索引列表。这个想法是在几何着色器中处理 4 个元素的组。选择组的方法是,如果我有列表,(1,2,3,4,5,6,7,8,...)那么组就是((1,2,3,4),(5,6,7,8),...)。
经过几个小时的编码后,我意识到几何着色器不接受 4 个顶点基元。我想知道是否有办法解决它。也许选择一个“激发顶点”并将其他 3 个顶点附加到它作为顶点着色器阶段中的添加属性(但我怀疑这是可能的)。
我在为点编写简单的传递几何着色器时遇到了一些问题。我想它应该是这样的:
#version 330
precision highp float;
layout (points) in;
layout (points) out;
void main(void)
{
gl_Position = gl_in[0].gl_Position;
EmitVertex();
EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)
当我没有指定几何着色器时,我在屏幕上显示了一堆点,但是当我尝试将此着色器链接到我的着色器程序时,没有显示任何点,也没有报告错误。
我正在使用 C# 和 OpenTK,但我认为这不是问题所在。
编辑:人们要求使用其他着色器,尽管我确实在不使用几何着色器的情况下测试了这些着色器,并且在没有几何着色器的情况下它们也能正常工作。
顶点着色器:
void main()
{
gl_FrontColor = gl_Color;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
void main()
{
gl_FragColor = gl_Color;
}
Run Code Online (Sandbox Code Playgroud) 我写了一个非常简单的传递几何着色器.我的输入原语是点,输出原语也是点.我还想通过几何着色器将颜色和法线从顶点着色器转发到片段着色器.着色器的编译和链接完美无瑕,但最终的颜色非常奇怪.我认为这种转发有问题.任何人都可以指出这个问题吗?这是我的着色器:
顶点着色器:
#version 330 compatibility
struct vData
{
vec3 normal;
vec4 color;
};
out vData vertex;
void main()
{
vertex.normal = gl_NormalMatrix * gl_Normal;
vertex.color = gl_Color;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
几何着色器:
#version 330
layout (points) in;
layout (points) out;
layout (max_vertices = 1) out;
struct vData
{
vec3 normal;
vec4 color;
};
in vData vertices[];
out vData frag;
void main()
{
int i;
for(i = 0;i < gl_in.length();i++)
{
frag.normal = vertices[i].normal;
frag.color = vertices[i].color;
gl_Position = gl_in[i].gl_Position;
EmitVertex(); …Run Code Online (Sandbox Code Playgroud) 所以我只是在学习几何着色器,我有一个用例。
出于性能方面的考虑,我不想一直使用几何着色器,甚至也不想使用它,因为大多数时候大多数对象都不需要它。但是,当我确实需要它时,顶点着色器和片段着色器应该做同样的事情。我可以重用顶点和片段着色器吗?
IE浏览器
顶点:
#version 330
in vec3 position;
out vec3 whatever;
void main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
几何:
#version 330
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
in whatever[];
out whatever;
void main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
分段:
#version 330
in whatever
void main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
因此,在没有几何着色器的情况下,这是可行的,因为顶点out whatever对应于fragment in whatever。但是,使用几何体着色器,我最终要重新定义输入和输出。
我读到可以使用:layout (location = 0) out whatever,然后不需要相同的名称,但这对我不起作用,出现编译错误:ERROR: -1:65535: '' : storage qualifier not valid with layout qualifier id。我认为这是由于我没有足够新的opengl版本来支持该语法。
我也读过您可以使用扩展名:arb_separate_shader_objects,但是找不到使用它的任何示例。
有什么建议么?
我正在建造水面,我想要正弦顶点移动以获得波浪对水的影响.我在获取OpenGL之前的理解是,这最好在几何着色器中完成.
然而,目前,我正在使用OpenGL 2.1的OpenGL ES 2.0子集,严格利用现代/可编程管道.此版本中不提供几何着色器.
我有三个选择:
主要是我想保持简单.所以考虑到我不知道OpenCL(还),或许我应该坚持向CPU发送大批量?
我希望能够将每个顶点的任意数量的变化值从顶点着色器传递到几何着色器.我知道OpenGL没有动态数组,所以应该在编译时指定数字.整个过程应该在带有NVIDIA GeForce 9400M显卡的Apple MacBook上运行,并且驱动程序只提供OpenGL 2.1以及一些扩展.
这里的问题似乎是几何着色器在表单或每个顶点有一个元素的数组中获取其输入.据我所知,我的设置中没有可用的数组数组,也没有包含数组的接口块数组.到目前为止,我能想出的最佳解决方案是指定一些变量来传递这些信息,从顶点着色器中的数组中提取并转换回几何着色器中具有特定步长的数组.这样,仍然可以使用计算的索引来执行对值的访问.
有更好,更优雅的方式吗?
为什么编译GLSL几何着色器会出现此错误?
错误:0:15:'gl_VerticesIn':未声明的标识符
这是着色器:
// makes wireframe triangles.
#version 330
#extension GL_ARB_geometry_shader4 : enable
layout(triangles) in;
layout(line_strip, max_vertices = 4) out;
void main(void)
{
for (int i = 0; i < gl_VerticesIn; i++)
{
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
gl_Position = gl_in[0].gl_Position;
EmitVertex();
EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)
对我来说似乎很简单,但我找不到关于"gl_VerticesIn"的更多信息,我认为这应该是内置的.如果我只用"3"替换"gl_VerticesIn",一切正常.
我正在使用GeForce GTX 765M和OpenGL 3.3核心配置文件.我没有使用任何其他GPU的此错误.我的司机是最新的.
我使用 OpenGL 着色器来绘制图形。图表的每个跨度都具有以下形式:
顶点着色器只是将 a 和 b 传递给几何着色器,然后几何着色器在max_vertices点处评估曲线。
问题是,有时几何着色器似乎变得“过载”并停止吐出点:
两条曲线实际上具有完全相同的值,但由于某种原因,底部曲线的几何着色器无法生成点。
当我更改max_vertices几何着色器的以下行时:
layout (triangle_strip, max_vertices = ${max_vertices}) out;
Run Code Online (Sandbox Code Playgroud)
从 1024 ( 的结果gl.glGetInteger(gl.GL_MAX_GEOMETRY_OUTPUT_VERTICES))到 256,然后我得到所需的输出:
怎么了?真正的最大顶点数是多少?为什么顶部的图表不受影响,但底部的图表已损坏?他们有相同的数据。
我有 vertex shader
#version 330 core
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 VertexUV;
layout(location = 2) in vec3 VertexNormal;
out VS_GS_VERTEX
{
vec2 UV;
vec3 vs_worldpos;
vec3 vs_normal;
} vertex_out;
uniform mat4 proj_matrix;
uniform mat4 model_matrix;
void main(void)
{
gl_Normal = VertexNormal;
gl_Position = proj_matrix * vec4(VertexPosition, 1.0);
vertex_out.UV = VertexUV; //VertexPosition.xy;
vertex_out.vs_worldpos = gl_Position.xyz;
vertex_out.vs_normal = mat3(model_matrix) * gl_Normal;
}
Run Code Online (Sandbox Code Playgroud)
和 fragment shader
#version 330 core
in GS_FS_VERTEX
{
vec2 UV;
vec3 vs_worldpos;
vec3 …Run Code Online (Sandbox Code Playgroud) 我正在使用实例渲染来绘制大量的立方体.现在,显然立方体中可见面的最大数量是3,这意味着就着色而言,我所做的工作量是所需的两倍.
因为这是实例化,所以我不能简单地只传递要绘制到着色器的几何体.但是如果在着色器中(我想象这将是几何形状或细分)我可以使用普通信息来丢弃基元,我可以减少不必要的操作数量.
例如,如果观察方向和表面法线之间的角度小于90度,我可以假设在当前方向前面有一个三角形,因此丢弃了这个给定的图元.
在管道中是否有一种方法可以确定是否需要片段并相应地丢弃它?