Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es opengl制作多个纹理的强大功能2_Opengl Es_Textures - Fatal编程技术网

Opengl es opengl制作多个纹理的强大功能2

Opengl es opengl制作多个纹理的强大功能2,opengl-es,textures,Opengl Es,Textures,我有许多(113)由blender创建的纹理图像(一个obj和一个引用纹理的mtl文件),它们不是2的幂。当我尝试使用单一纹理(2的幂)渲染简单对象时,效果很好,但对于我上面描述的复杂对象,它只绘制几何体(所有对象都是白色,没有纹理) 这是因为我的纹理尺寸吗?如果是,是否有一种在运行时将多个纹理/位图设置为二次幂的解决方案?(我不知道尺寸。) 我还怀疑glbindtexture是否正确使用(我正在Android上工作。) 首先,我调用glgentextures(,textureArray)。然后

我有许多(113)由blender创建的纹理图像(一个obj和一个引用纹理的mtl文件),它们不是2的幂。当我尝试使用单一纹理(2的幂)渲染简单对象时,效果很好,但对于我上面描述的复杂对象,它只绘制几何体(所有对象都是白色,没有纹理)

这是因为我的纹理尺寸吗?如果是,是否有一种在运行时将多个纹理/位图设置为二次幂的解决方案?(我不知道尺寸。)

我还怀疑
glbindtexture
是否正确使用(我正在Android上工作。) 首先,我调用
glgentextures(,textureArray)
。然后,在每个对象的循环中,我调用
glbindtexture(…_2D,textureArray[I])
和GLutils.texImage2D(…)。最后,在绘图时,我调用
glbindtexture(…,textureArray[I])
,然后调用
gldrawarrays

这有什么问题吗? (编辑)我忘了说,我正在使用opengl es 1.1,我在某个地方读到opengl es 1.1不支持NPOT textrues


提前感谢。

运行此方法检查OpenGL驱动程序状态错误:

public void checkGlError(String op) {
    int error;
    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
            Log.e("ShadingZen", op + ": glError " + error);
            //throw new RuntimeException(op + ": glError " + error);
    }
 }
根据您的测试设备,可能无法使用两种纹理的非幂。此代码显示如何将它们转换为^2大小(在android中):


查看此类了解更多信息:

生成纹理时,要使用非2次幂纹理,需要启用这些参数

glGenTextures(1, &nID);
glBindTexture(GL_TEXTURE_2D, nID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //should probably use these
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //these let you use NPOT textures
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

看起来不错。。你有任何总账错误吗?在哪里……不,我不知道。物体画得很好,但是没有纹理。顺便说一句,当我绑定一些随机的POT(二的幂)纹理时,它是有效的。嗯……它不起作用。尽管如此,所有的东西都是白色的,没有纹理。请将其保存在代码中,这离您解决问题更近了一步,因为您肯定需要它来处理非幂2纹理。也许可以粘贴你的代码,这样我们就可以看到到底发生了什么。加载纹理的问题用TraxNet post解决了。现在我有一个新的问题在下面的评论中描述。你知道吗?如果你需要我的密码,请告诉我。我会尽快发布。你能简单地说一下这段代码的作用吗?我的意思是它拉伸图像或添加点作为边框?它从Android原始资源id加载图像,然后检查它是否是两个图像的幂。如果不是,则查找最近的二次幂并重新缩放。阅读链接中的源代码,它可以轻松处理纹理。希望有帮助。我使用了checkleror函数,得到了错误1281。然后我应用了你的代码,不再有错误了。但是现在它太慢了。(每4-5秒绘制一个场景,然后是黑屏)并且在我的日志中显示:eglLockWindowSurface:未能映射fd的内存=*一个数字*offs=*另一个数字*此代码应仅在加载时应用,然后在绘制循环期间调用Bindtexture。不应该很慢。如果加载时间很慢,请在编译时或使用任何图像修饰应用程序调整纹理大小。
glGenTextures(1, &nID);
glBindTexture(GL_TEXTURE_2D, nID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //should probably use these
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //these let you use NPOT textures
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);