gpt4 book ai didi

OpenGL,为什么这段代码不能按我的预期工作?

转载 作者:行者123 更新时间:2023-12-02 10:03:56 26 4
gpt4 key购买 nike

您好,很抱歉提出这样一个具体的问题。

我有以下 GLSL 顶点着色器:

#version 140

uniform vec2 viewport_size;

in vec2 vertex_position;

in vec2 in_texture_uv;
varying vec2 texture_uv;


void main(void)
{
texture_uv = in_texture_uv;

gl_Position = vec4(vertex_position / viewport_size, 0, 1);
}

以及相应的片段着色器:

#version 140

uniform sampler2D texture_image;

out vec4 out_frag_color;

varying vec2 texture_uv;


void main(void)
{
out_frag_color = texture(texture_image, texture_uv);
}

产生这个输出(注意左下角的小蓝点): output_actual

奇怪的是,如果我替换

texture_uv = in_texture_uv;

texture_uv = vertex_position;

输出变为:output_vertpos (注意底部和左侧的边框)。

最后,如果我写:

texture_uv = vertex_position;
texture_uv = in_texture_uv;

输出正确:output_correct ,这对我来说没有任何意义......

有人能解释一下为什么会发生这种事吗?感谢您的宝贵时间!

<小时/>

相关代码片段:

float[] positionVboData = new float[] {
// X Y U V
0.0f, 0.0f, 0f, 0f,
50.0f, 0.0f, 1f, 0f,
50.0f, 25.0f, 1f, .5f,
0.0f, 50.0f, 0f, 1f,
};

.

// vertices
GL.GenBuffers(1, out verticesHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, verticesHandle);
GL.BufferData<float>(BufferTarget.ArrayBuffer, new IntPtr(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StaticDraw);

// vertices: vertex_position
GL.EnableVertexAttribArray(0);
GL.BindAttribLocation(program, 0, "vertex_position");
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, sizeof(float)*4, 0);

// vertices: texture_uv
GL.EnableVertexAttribArray(1);
GL.BindAttribLocation(program, 1, "in_texture_uv");
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, sizeof(float)*4, sizeof(float) * 2);

纹理:

sample_texture

最佳答案

需要比我在评论中拥有的空间更多的空间...

<小时/>

假设GL.Viewport实际上是glViewport的包装器,那么<​​/p>

GL.Viewport(-Width, -Height, Width*2, Height*2)

没有什么意义,因为它将 3/4 的视口(viewport)带到窗口表面之外。 只需传递(0, 0, width, height)即可在整个窗口上进行绘制,0, 0位于左下角。如果您想将 GL 输出限制为窗口的子集,请相应地调整参数。

从技术上讲,glViewport 定义了 X 和 Y 的标准化设备坐标窗口坐标的转换。了解 OpenGL 中的空间非常重要。花一些时间在上面。

话虽如此,顶点着色器的输出也很奇怪。如果你想用你的多边形“填充你的窗口”,你不需要做那么奇怪的事情

vertex_position / viewport_size

顶点着色器中的除法。

请记住,顶点着色器以剪辑坐标输出,之后OpenGL通过将X、Y、Z除以W,将坐标引入标准化设备坐标。标准化设备坐标所有三个维度的范围从 -1 到 1。只有落在这个 2x2x2 立方体内部的点才会被实际光栅化。

还记得我说过的关于glViewport的内容吗?

那么,有什么技巧呢?只需输出 W=1 的坐标,以便它们实际上已经在 NDC 中。因此,如果您希望四边形跨越 GL 绘制的窗口的整个区域,只需构建类似的东西

float coords[] = { -1, -1,
1, -1,
1, 1,
-1, 1 };

或者,根据您的原始代码,如果您想要梯形,请使用类似的东西

float coords[] = { -1, -1,
1, -1,
1, 0,
-1, 1 };

然后将它们传递给顶点着色器:

in vec2 position;

void main() {
gl_Position = vec4(position, 0, 1);
}

结果:

result

<小时/>

¹ 请使其成为 GL_TRIANGLE_FAN,而不是 GL_QUADGL_POLYGON

关于OpenGL,为什么这段代码不能按我的预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24228864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com