片段着色器究竟如何用于纹理?
How exactly does fragment shader work for texturing?
我正在学习opengl,我认为我几乎了解片段着色器。我的直觉是片段着色器只应用于每个像素一次,但最近在处理纹理时,我对它们的工作原理感到困惑。
首先,片段着色器通常采用一系列纹理坐标,因此如果我有一个四边形,片段着色器将采用四边形 4 个角的纹理坐标。现在我不明白的是采样过程,即获取纹理坐标并在该纹理坐标处获得适当颜色值的过程。具体来说,由于我只提供 4 个纹理坐标,opengl 如何知道对颜色值之间的坐标进行采样。
当您考虑到顶点着色器直接进入片段着色器并且顶点着色器按顶点应用时,此任务变得更加混乱。这意味着在任何给定时间,片段着色器只知道对应于单个顶点的纹理坐标,而不是组成四边形的整个 4 个坐标。因此,当它一次只有一个纹理坐标可用时,它如何确切地知道对适合屏幕上形状的值进行采样?
所有varying
变量都是自动插值的。
因此,如果您将每个顶点的纹理坐标放入varying
中,之后您无需对它们执行任何特殊操作。
它可以像这样简单:
// Vertex
#version 330 compatibility
attribute vec2 a_texcoord;
varying vec2 v_texcoord;
void main()
{
v_texcoord = a_texcoord;
}
// Fragment
uniform vec2 u_texture;
varying vec2 v_texcoord;
void main()
{
gl_FragColor = texture2D(u_texture, v_texcoord);
}
免责声明:我使用了旧的 GLSL 语法。在较新的 GLSL 版本中,attribute
将替换为in
。varying
将替换为顶点着色器中的out
和片段着色器中的in
。gl_FragColor
将替换为自定义out vec4
变量。texture2D()
将替换为texture()
请注意,此片段着色器不执行任何手动插值。它只接收一个vec2 v_texcoord
,从包含原始1电流片段所属的顶点v_texcoord
s进行插值。
1.基元是指点、线、三角形或四边形。
first:在核心上下文中,您仍然可以使用gl_FragColor。
第二:你有纹素,碎片和real_monitor_pixel。这些是不同的 事情。 假设这一行是关于将纹素转换为片段(或完全转换为像素IDK)的:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
当纹素小于片段(像素)时
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 片段着色器究竟如何用于纹理?
- 如何将垂直纹理应用于QT Surface3D
- miscflags d3d11_resource_misc_gdi_compatible用于GDI兼容纹理,而idxgi
- OpenGL纹理不适用于分辨率大于1x1的情况
- 纹理未应用于 2D 几何体
- 纹理不适用于 OpenGL
- 用于 SDL 纹理的内存高效资源管理器
- OpenGL ES 2 如何渲染到纹理并提取用于 GPGPU 测试的数据
- Opengl 数组纹理,适用于原始数据,但不适用于图像数据
- 用于渲染 3D 球体的纹理坐标
- glGenerateMipmap 不适用于 OpenGL 中的 3D 纹理
- Opengl纹理坐标用于全屏效果
- 用于异步纹理加载的设施