我最近通过opengl教程寻找光线追踪.大多数教程都更喜欢计算着色器.我想知道他们为什么不渲染纹理,然后将纹理渲染为四边形.
计算着色器方法在屏幕四边形上的优缺点是什么?
我真的不明白片段着色器是如何工作的.
我知道
由于片段着色器每个顶点不起作用,但每个片段如何将数据发送到片段着色器?顶点数量和碎片数量不相等.
如何确定哪个片段属于哪个顶点?
我正在尝试创建一个正方形并在其中间放置一个红色圆圈.正如你在简单的vert I中看到的那样,我将map(-1,1)范围扩展到(0,1)范围:
coord = position.xy*0.5 + vec2(0.5,0.5);
Run Code Online (Sandbox Code Playgroud)
如果你看一下simple.frag,就有这一行:
if(abs(length(coord - vec2(0.5,0.5))) < 0.3)
Run Code Online (Sandbox Code Playgroud)
因此,我期待在广场中间的红色圆圈.然而,这发生了:
圆心超过(0.5,0.5).如果我将该行更改为:
if(abs(length(coord - vec2(0.0,0.0))) < 0.3)
Run Code Online (Sandbox Code Playgroud)
输出是:
正如预期的那样,圆圈的中心位于左下角.但是不应该是右上角(1,1)?圆圈也不是完美的圆圈.我错过了什么?
初始化:
Shader simpleShader("simple.vert", "simple.frag");
Shader quadShader("quad.vert", "quad.frag");
GLfloat inVertices[] = {
-1.0f, 1.0f, 0.0,
-1.0f, -1.0f, 0.0,
1.0f, -1.0f, 0.0,
-1.0f, 1.0f, 0.0,
1.0f, -1.0f, 0.0,
1.0f, 1.0f, 0.0 };
GLfloat quadVertices[] = {
-1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f, …Run Code Online (Sandbox Code Playgroud)