所以我有一个opengl程序在对象上绘制一个组。当我绘制这些对象时,我想使用我的着色器程序是一个顶点着色器和一个顶点着色器。基本上,我的目标是根据纹理计算调整顶点着色器内模型的高度。就是这样。否则我希望绘制对象就像使用裸露的openGL(没有着色器)一样。我不想实现片段着色器。
然而,我还没有找到如何制作它,所以我可以使用只有顶点着色器的着色器程序而不是其他任何东西。忘记关于调整模型高度的部分,到目前为止,我有:
gl_FrontColor = gl_Color;
gl_Position = modelViewProjectionMain * Position;
它将对象转换为正确的位置,但是当我这样做时,我会丢失纹理坐标和光照信息(法线丢失)。我错过了什么?我如何写一个"什么都不做"顶点着色器?也就是说,在绘制带法线的纹理.obj时可以关闭和打开的顶点着色器,并没有区别?
答案 0 :(得分:2)
您无法使用部分实现来编写着色器。您可以在着色器中执行所有操作,也可以完全依赖于给定对象的固定功能(不建议使用)。
你可以做的是:
glUseProgram(handle)
// draw objects with shader
glUseProgram(0)
// draw objects with fixed functionality
答案 1 :(得分:1)
为了扩大Abhishek Bansal的完全正确的答案,你想做的事情会很好但实际上是不可能的。您将不得不编写自己的顶点和片段着色器。
从您的文章中,“裸露的OpenGL”是指OpenGL 1和2中的固定功能管道,其中包括内置照明和纹理。 OpenGL中的着色器完全取代了固定功能管道而不是扩展它。在OpenGL 3+中,旧功能已被删除,所以现在它们是强制性的。
好消息是顶点/片段着色器执行与原始OpenGL照明和纹理相同的功能很容易找到并且易于修改以达到您的目的。 Rost,Licea-Kane等的OpenGL着色语言书有一整章“模拟OpenGL固定功能”或者您可以获得第5版OpenGL SuperBible书籍和代码(不是第6版)的副本。有用的预定义着色器。或者,如果您更喜欢在线资源和书籍,那么有NeHe教程。
写入着色器起初看起来有点令人生畏,但它比你想象的要容易,而且额外的灵活性非常值得。