我个人论坛:http://hongwgw.com/image/forum.php?mod=viewthread&tid=1&page=1&extra=#pid1
1.
当你运用 glDrawXXX(),一些数据被隐式调用,甚至它们没有被绘制命令作为参数,它们包括:a.通过glBindBuffer绑定的VBO里的顶点数据;
b.VAO里的index list,通过 glBindBuffer和 glAttribPointer 向下传递至VBO上下文;
c.通过 glUseProgram()将shader传入;
d.通过 glTextureBuffer() and glTexBuffer()将纹理传入VBO
e.其它
glUseProgram 解释为 加载并使用连接好的程序。
glTexBuffer() attaches the data store of a specified buffer object to a specified texture object
这些解释并没有特指“加载”或者“绑定”是什么
"current rendering state"可能指 "OpenGL context",但是并没有说清楚。
以上的一些函数有“target”参数,但是没有清晰的意思,比如glBindTexture的target参数可以为 GL_TEXTURE_2D,但是你可以指定多于一个的2D纹理去绘制一个物体,这样这个target更多的是一个类型而非目的。
希望能找到所有的这些隐式指定。
回答1:我来先处理 GL_TEXTURE_2D部分
这是在opengl老版本中使用,现在没什么意义了。
在opengl1.0中并不支持纹理对象,只有一个单一的纹理可以使用。如果你想知道的更多,你可以围绕这它用显示列表来做一个坏事情,但是还是只能加载和使用一个纹理。
尽管如此,纹理可以在一些模式下被配置使用。特别是1D和2D。在以后的版本可以使用更多。指定 GL_TEXTURE_1D程序就只能使用1D。2D也是如此.
opengl1.0下的规则在以后的版本中仍是合法的。在1.1版本中,加入了“binding”,这样你可以绑定一个texture,并且在以后新版本中通过各种新的api使用这个绑定对象,或者绑定0返回到opengl版本1.0的状态。
所以GL_TEXTURE_2D(和一些类似的)仍然是合法的,但是不受欢迎的。它们为了opengl1.0兼容性而存在,在天空和和纹理数组仍在使用。
回答2:
https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices
https://www.khronos.org/opengl/wiki/FAQ
https://www.khronos.org/opengl/wiki/Common_Mistakes
opengl要绘制物体,就得有个“ program object ”在GPU上计算,当计算完,就将结果输出到帧缓存当中。
有一个默认的帧缓存可以让你无需创建一个自己的,但有时你想使用更多的层来绘制或者想改变结果的的格式,那么就创建一个,然后复制到默认的帧缓存当中。
https://www.khronos.org/opengl/wiki/Vertex_Rendering
opengl在gpu里是异步的。opengl写完命令就返回了,未必得到执行,指令在gpu中堆积,由gpu驱动决定什么时候可以运行。
应用程序时客户端,opengl是服务器端。从服务器端下载东西是很差性能的。
https://www.khronos.org/opengl/wiki/Memory_Model
glTextureBuffer() 和 glTexBuffer() 是同样的东西
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexBuffer.xhtml
glTexBuffer() GL_TEXTURE_BUFFER指定要绘制目标, 以为首先指定一个buffer object
glTextureBuffer() (= the DSA version)