opengl shader 问题

chenliyan123007 2012-05-27 03:55:35
大家好,
请问如何同时给两个物体着色.我的代码如下
basicShaderVert = compileShader("Assets/basic_shader_v.glsl", GL_VERTEX_SHADER);
basicShaderFrag = compileShader("Assets/basic_shader_f.glsl", GL_FRAGMENT_SHADER);
terrainShaderVert = compileShader("Assets/terrainshader_v.glsl", GL_VERTEX_SHADER);
terrainShaderFrag = compileShader("Assets/terrainshader_f.glsl", GL_FRAGMENT_SHADER);
// Link shader programs here
obj.program = linkProgram(basicShaderVert, basicShaderFrag);
terrain.program = linkProgram(terrainShaderVert, terrainShaderFrag);

我的obj 跟terrain是两个模型 他们都属于同一个结构Object
struct Object {
Mesh mesh; // Polygon definition
unsigned int vbo; // VBO id
unsigned int program; // Shader Program id
}
然后我 开始使用shader
for (list<Object*>::iterator it = objects.begin(); it != objects.end(); ++it) {
glUseProgram((*it)->program);
}
这个for loop就是循环的就是所有 list 里面的Object, 在程序中我已经把obj 跟terrain放进去了。
最后画出来的是obj 的颜色正常,是彩色的,但是terrain 变成白白的很亮的一块。但是他们两的glsl文件里的内容一样。
求解答。。。。


...全文
238 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
peng_weida 2012-05-28
  • 打赏
  • 举报
回复
对一组shader使用完毕后,应该加句glUseProgram(NULL);
还有其它提示信息吗?
chenliyan123007 2012-05-28
  • 打赏
  • 举报
回复
问题就是,如果一次对两个物体使用不同的shader
peng_weida 2012-05-28
  • 打赏
  • 举报
回复
说明terrain这组shader有问题噻,但你又说它和另一组shader一样,
估计是你哪个地方出了小问题,仔细检查下~
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

把glUseProgram(0);放循环内试试

不行。不是这个问题。。当我把glUseProgram((*it)->program);
换成glUseProgram(obj.program); 的时候,地形跟方块都上色了
换成glUseProgram(terrain.program); 的时候地形跟方块都是白的。
[/Quote]
chenliyan123007 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

把glUseProgram(0);放循环内试试
[/Quote]
不行。不是这个问题。。当我把glUseProgram((*it)->program);
换成glUseProgram(obj.program); 的时候,地形跟方块都上色了
换成glUseProgram(terrain.program); 的时候地形跟方块都是白的。
peng_weida 2012-05-28
  • 打赏
  • 举报
回复
把glUseProgram(0);放循环内试试
chenliyan123007 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

分开吧~
glUseProgram(program_1);
drawOne();
glUseProgram(0);

glUseProgram(program_2);
drawTwo();
glUseProgram(0);

如果你绘制两个模型都用同一组shader,才放一起~
glUseProgram(program);
drawOne();
drawTwo();
……
[/Quote]
分开的话我的结构就要大改动了,那个LOOP的结构是老师给的。不会错。有没有其他的办法?
peng_weida 2012-05-28
  • 打赏
  • 举报
回复
分开吧~
glUseProgram(program_1);
drawOne();
glUseProgram(0);

glUseProgram(program_2);
drawTwo();
glUseProgram(0);

如果你绘制两个模型都用同一组shader,才放一起~
glUseProgram(program);
drawOne();
drawTwo();
glUseProgram(0);
chenliyan123007 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

对一组shader使用完毕后,应该加句glUseProgram(NULL);
还有其它提示信息吗?
[/Quote]
我的两个模型是在一个LOOP里面进行RENDER的。在RENDER的末尾,我有进行glUseProgram(0);

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧