<blockquote>
<p>Could someone please give me a simple example of the vertex and fragment shaders interacting to make multiple polys with different textures?</p>
</blockquote>
<p>谷歌GLSL教程。例子是以前写过的,没有理由只为你再写一次。或者下载NVidia OpenGL SDK,并对其进行检查。OpenGL.org网站同时推荐书籍。”橙书“涵盖着色器。在</p>
<blockquote>
<p>which is split into 256x256</p>
</blockquote>
<p>传统上,我们建议做相反的-采取所有的纹理,并将它们组合成一个“阿特拉斯”纹理,最好是类似16384x16384的纹理-以尽量减少状态切换。在</p>
<blockquote>
<p>What I want is to draw a textured model with a shader, with multiple textures, but the model is a flat background. It's a large (1600x800 or so) image</p>
</blockquote>
<p>1600x800将完全适合几乎所有硬件的纹理,因为Riva TNT 2 pro。如果你关心“浪费”纹理内存,那么很多卡片支持非2次幂的纹理。然而,非二次幂纹理通常有局限性,在使用这种纹理的<em>某些</em>硬件(某些ati卡+驱动程序)上,会导致fps急剧下降。一、 从200..400到40。这不值得。在配备256MB VRam的硬件上,未使用的40%纹理是微优化。如果你对vram的使用感到吝啬的话,你可以使用纹理图集,用有用的东西填充“浪费”的空间。另外,请记住,您永远不知道<strong>驱动程序</strong>使用视频内存的效率如何。在</p>
<blockquote>
<p>I want to do it all in the shader without having to bind the texture for each chunk on the CPU,</p>
</blockquote>
<p>你不能那样做。着色器不绑定纹理。它们使用已经绑定的纹理。在</p>
<blockquote>
<p>I'm not sure if it works, since the shaders don't currently compile,</p>
</blockquote>
<p>好吧,让他们编译后再问一次。在没有看到着色器或错误消息的情况下,无法帮助您。你知道着色器编译器<a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetShader.xml" rel="nofollow">produces error messages</a>,对吧?在</p>
<blockquote>
<p>After getting frustrated with the fixed-function pipeline being slow in Python</p>
</blockquote>
请考虑切换到C语言或C++语言。你可以轻松地得到200…400帧每秒的原始固定函数OpenGL在C/C++应用程序(“地牢爬虫”)中,不使用缓冲区或显示列表-<强>如果</St>你使用正确的算法来消除隐藏表面(和VSYNC被禁用)<强>和< /强>你的纹理是MIP映射。众所周知的“固定功能”应用程序包括地震1..3,半衰期1,立方体和许多其他游戏都是非常快的。也就是说,如果进展缓慢,那是你的错。在</p>
<P>不同于C/C++,Python具有较大的函数调用开销——执行字节码,从列表/元组中提取未知类型的值(可以包含任何“设计”),然后将其作为浮点(如GLVTEX3F)倾倒,而最后将其转发到本机API调用将比没有中间步骤的类似C/C++调用要慢。您可以通过使用显示列表或缓冲区对象来抵消这一点,但对于我来说,这样做是不值得的。然而,在特定的任务中使用特定的语言是个人偏好的问题。在</p>
<p>编辑</p>
<blockquote>
<p>However, if shaders can't bind textures, how does multitexturing work? </p>
</blockquote>
<p>有N个纹理阶段(至少2个-se glGet/GL_MAX_texture_COORDS/GL_MAX_texture_UNITS),可以一次设置多个纹理。见<a href="http://www.opengl.org/sdk/docs/man/xhtml/glActiveTexture.xml" rel="nofollow">glActiveTexture</a>。如果没有着色器(固定函数),则使用<a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml" rel="nofollow">glTexEnv</a>为每个阶段指定颜色操作。{4中使用多个纹理采样器来指定纹理,然后使用相同的纹理集来读取纹理。着色器无法切换纹理。它可以使用已经由程序设置的纹理。着色器不了解着色器之外的任何纹理。技术上,着色器甚至不知道“纹理”,它有“采样器”用来读取数据。在</p>
<blockquote>
<p>Or texture sampling? Shaders must be able to do some work with selecting/changing textures... </p>
</blockquote>
<p>着色器根本不切换或选择纹理。这部分由你的程序完成。有关更多信息,请阅读OpenGL规范和您的OpenGL/GLSL版本的GLSL规范。这两个版本都可以从opengl.org网站网站,“文档”菜单。在</p>
<p>正如我已经说过的,此时您需要GLSL教程或书籍。两者都很容易找到。找一个,一直读到你“明白”为止。目前它看起来不像你做了你的家庭作业,并试图做一个简单的着色器使用书籍或教程。如果你找不到一本书,那么NVIDIA OpenGL SDK有很多例子(C/C++,但转换它们并不难)。在</p>