Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLSL-何时何地调用顶点和片段?_C++_Opengl_Glsl_Shader - Fatal编程技术网

C++ GLSL-何时何地调用顶点和片段?

C++ GLSL-何时何地调用顶点和片段?,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我想知道什么时候在opengl循环中调用顶点和片段着色器。它是在glutDisplayFunc()或glutMainLoop()的末尾,还是在每个顶点绘制调用中?顶点和片段是一个接一个地连续调用的(即:顶点然后片段),还是完全不同的时间 假设我有以下代码片段: glPushMatrix(); glRotatef(rot,0.0f,1.0f,0.0); glTranslatef(0.0f,0.0f,25); glColor3f(0.0,0.0,1.0); drawS

我想知道什么时候在opengl循环中调用顶点和片段着色器。它是在glutDisplayFunc()或glutMainLoop()的末尾,还是在每个顶点绘制调用中?顶点和片段是一个接一个地连续调用的(即:顶点然后片段),还是完全不同的时间

假设我有以下代码片段:

glPushMatrix();
    glRotatef(rot,0.0f,1.0f,0.0);
    glTranslatef(0.0f,0.0f,25);
    glColor3f(0.0,0.0,1.0);
    drawSphere(4,20,20); // draw triangles

    glColor3f(1.0,0.0,0.0);
    glTranslatef(0.0f,0.0f,5);
    drawSphere(4,20,20); // draw triangles
glPopMatrix();
顶点着色器是否在每次顶点调用后都会被调用,然后读取堆栈顶部的当前矩阵,然后将预定义的ModelView矩阵统一发送给顶点着色器?片段着色器何时运行

是在glutDisplayFunc()还是glutMainLoop()的末尾

两者都不是,因为GLUT不是OpenGL的一部分。它只是一些库(用于创建简单的OpenGL应用程序)

还是在每次顶点绘制调用时都是这样

从程序员的角度来看,它并没有具体说明什么时候发生。OpenGL有一个命令队列,它们之间的事务被断言为要处理的,进入命令队列并到达所谓的“同步点”。同步点是使用或传输OpenGL上下文之外的数据的任何命令(如使用以前的OpenGL命令生成的
glReadPixels
读取的图像)

对于所有实际的方法,您可以假设在指定整个基本体后,顶点和片段都会得到处理。所以,如果你画三角形,那么每3个顶点,你就得到了所有你需要画一个三角形并开始处理它

是在glutDisplayFunc()还是glutMainLoop()的末尾

两者都不是,因为GLUT不是OpenGL的一部分。它只是一些库(用于创建简单的OpenGL应用程序)

还是在每次顶点绘制调用时都是这样

从程序员的角度来看,它并没有具体说明什么时候发生。OpenGL有一个命令队列,它们之间的事务被断言为要处理的,进入命令队列并到达所谓的“同步点”。同步点是使用或传输OpenGL上下文之外的数据的任何命令(如使用以前的OpenGL命令生成的
glReadPixels
读取的图像)



对于所有实际的方法,您可以假设在指定整个基本体后,顶点和片段都会得到处理。因此,如果您绘制三角形,那么每3个顶点就可以绘制一个三角形并开始处理它。

简单的回答是,您的程序的操作与特定OpenGL实现如何处理这一点无关。需要指出的一点是,您的代码使用的是固定函数管道,因此,如果您的drawcall是
glEnd
,可编程单元可能根本无法运行。我使用的固定函数管道调用是什么,以便我可以更改它们?另外,它们的代码段正上方有一个glUseProgram()调用,实际上。。。都是
Rotate/Translate/PushMatrix/PopMatrix
操作全局矩阵堆栈,并且
Color
更改全局顶点颜色值,这两个值都由统一变量(或顶点属性)替代。哦,你是说将顶点/颜色信息放在VAO/VBO上吗?如果是这样的话,这会使推送和弹出矩阵变得多余吗?简单的回答是,您的特定OpenGL实现如何处理这一点与程序的操作无关。需要指出的是,您的代码使用的是固定函数管道,因此,如果您的drawcall是
glEnd
,可编程单元可能根本无法运行。我使用的固定函数管道调用是什么,以便我可以更改它们?另外,它们的代码段正上方有一个glUseProgram()调用,实际上。。。都是
Rotate/Translate/PushMatrix/PopMatrix
操作全局矩阵堆栈,并且
Color
更改全局顶点颜色值,这两个值都由统一变量(或顶点属性)替代。哦,你是说将顶点/颜色信息放在VAO/VBO上吗?如果是这样的话,推和弹出矩阵会变得多余吗?太糟糕了,我想我可能会偶尔回答一个问题,结果它被偷了:)。我想添加一点关于
glFlush
,因为这也会强制渲染操作。除此之外,它总是关于“你什么时候需要像素”,而现代的驱动程序。。。是的,你永远不会知道。@BartekBanachewicz:
glFlush
不会强制渲染在返回时完成。那将是
glFinish
@RetoKoradi:没有人说它什么时候完成
glFlush(…)
强制GL在“有限时间”内开始处理命令队列。它基本上告诉GL让它的屁股忙于处理队列中的一些命令,而不是只是向队列中添加更多命令,并等待它认为合适的时间开始处理队列;)@科尔曼:我阅读巴特克评论的方式是,他建议将
glFlush
列为同步点。事实并非如此。我对glFlush的功能非常熟悉。太糟糕了,我想我可能会偶尔回答一个问题,结果它被偷了:)。我想添加一点关于
glFlush
,因为这也会强制渲染操作。除此之外,它总是关于“你什么时候需要像素”,而现代的驱动程序。。。是的,你永远不会知道。@BartekBanachewicz:
glFlush
不会强制渲染在返回时完成。那将是
glFinish
@RetoKoradi:没有人说它什么时候完成
glFlush(…)
强制GL在“有限时间”内开始处理命令队列。它基本上告诉GL让它的屁股忙于处理队列中的一些命令,而不是只是向队列中添加更多命令,并等待它认为合适的时间开始处理队列;)@我读易货的方式