Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 在OpenGL ES中渲染一个好的/有效的练习期间编译着色器?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
系统: Android 4.03,OpenGL ES 2.0 @H_262_5@ @H_262_5@问题:当第一帧已经用另一个程序/着色器渲染后调用glAttachShader时,某些设备(Galaxy S3)崩溃并出现“GL_INVALID_VALUE”错误(错误堆栈中没有更多详细信息).其他设备(华硕eee TF101)完全没问题.错误并不总是发生,有时它也是“GL_INVALID_ENUM”.
如果我强制所有着色器在第一次调用onDrawFrame时编译,它适用于所有(我的)设备.

@H_262_5@问题:
是否存在openGL(ES)机器无法编译着色器的状态?
绑定缓冲区,纹理或启用的@L_674_7@数组是否可能干扰将着色器附加到程序?
如果是这样,在连接着色器和链接程序之前必须确保的理想状态是什么?
在用其他着色器渲染其他对象之后编译着色器是否有效?

@H_262_5@背景:我正在开发一个Android库,它允许我以更加面向对象的方式使用openGL图形(使用“场景”,“材料”,“模型”等对象),可以轻松地编写游戏.场景,模型等是在与GL上下文不同的线程中创建的.只有当onDrawFrame遇到其中一个对象时,它才会在右侧线程中执行缓冲区对象绑定,纹理绑定和着色器编译.
我想避免在我的代码开头编译所有着色器.根据材质,模型和场景的要求组装着色器源(例如:材质:包括凹凸贴图,模型:包括矩阵 – 调色板 – 遮蔽,场景:包括雾).当从场景中移除模型时,我将再次删除着色器 – 如果我添加一个模型,则应该临时编译新着色器.

@H_262_5@在这一点上,我试图尽可能简洁而不发布代码 – 你可以想象从这个库中提取相关部分是很困难的.

解决方法

尽管不鼓励因为驱动程序需要为此获取资源(cpu),但在渲染期间编译是完全有效的.一些驱动程序声明我的触发器在驱动程序端重新编译着色器,因为某些状态被注入到着色器中.明智的做法是将绘图调用重新组织为共享相同驱动程序状态的块(由着色器程序首选,这是驱动程序执行的最昂贵的操作之一). @H_262_5@ @H_262_5@提示:确保“使用”声明到着色器中的所有变量,制服和@L_674_7@,否则,Mali驱动程序会在编译期间删除它们,当您尝试获取统一位置,@L_674_7@位置和子级时,驱动程序将返回GL_INVALID_VALUE.

@H_262_5@希望有所帮助.

大佬总结

以上是大佬教程为你收集整理的android – 在OpenGL ES中渲染一个好的/有效的练习期间编译着色器?全部内容,希望文章能够帮你解决android – 在OpenGL ES中渲染一个好的/有效的练习期间编译着色器?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。