我试图找出如何将数据从片段着色器读回到应用程序,但特别是内置变量中的片段着色器
这是我正在尝试做的一个示例,在下面的片段着色器中,我尝试将片段着色器变量 gl_FragCoord.y 读回应用程序
#version 330
out vec4 outputColor;
void main()
{
gl_FragCoord.y??????
outputColor = vec4(0.2f, 0.2f, 0.2f, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)
我如何将此值传递回应用程序,是通过统一变量完成的吗?缓冲对象?或者其他方式?或者根本可以做到吗?
我特别尝试获取每次片段着色器运行时的 gl_FragCoord.y 值
据我所知,顶点获取阶段是由 VAO 封装的,并且 VAO 需要包含顶点获取阶段状态,以便在缓冲区对象和顶点属性之间进行管道传输以及格式化缓冲区对象中的数据。
我读过的关于这个主题的两本书 i.Red book, Blue book 都明确提到 VAO 必须包含顶点获取阶段状态数据
然而,当我实际创建 2 个纹理对象并简单地格式化数据一次而不使用 VAO 来存储有关缓冲区的信息时,它仍然运行良好,没有任何问题,然后我再次重新加载第一个对象,并且再次运行良好没有任何问题,那么有关缓冲区对象中数据格式的信息是从哪里提取的呢?
我什至第二次将缓冲区数据上传到同一个缓冲区对象,这意味着之前保存在那里的信息将被重置?并且图片在窗口上仍然呈现良好
那么究竟发生了什么?书上说了一件事,现实中发生的事情完全不同且相反
有人能真正解释一下这里真正需要什么,不需要什么吗?究竟发生了什么?
我们什么时候真正需要 VAO,什么时候可以不需要?当不需要时额外的代码处理有什么意义呢?
代码如下:
int main(){
int scrW=1280, scrH=720;
//create context and shader program
init(scrW, scrH);
createShaders();
//create texture objects and load data from image to server memory
char object[2][25];
strcpy(object[0], "back.bmp");
strcpy(object[1], "256x256.bmp");
//triangle 1
GLfloat vertices[] =
// X Y U V
{ -1.0, -1.0, 0.0, 0.0,
1.0, -1.0, 1.0, 0.0,
1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, 0.0, …Run Code Online (Sandbox Code Playgroud)