最后显示mipmap某一级别纹理时 这个级别是gpu选择的还是写的渲染程序里设置的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最后显示mipmap某一级别纹理时 这个级别是gpu选择的还是写的渲染程序里设置的相关的知识,希望对你有一定的参考价值。

参考技术A dx9.0 DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件284它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。 DirectX 5.0 微软公司并没有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。 DirectX 6.0 DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可dzcDirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。∧irectX 7.0 DirectX 7.0最大的特色就是支持T&L,中文名称是“坐标转换和光源”。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的4虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。在T&L问世之前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显示卡的GPU来计算这样就可以把CPU从繁忙的劳动中解脱出来。换句话说,拥有T&L显示卡,使用DirectX 7.0,即使没有高速的CPU,同样能流畅的跑3D游戏。 DirectX 8.0 DirectX 8.0的推出引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader)与顶点渲染引擎(Vertex Shader),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。此时DirectX的权威地位终于建成。 DirectX 9.0 2002年底,微软发布DirectX9.0。DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。 PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无......余下全文>> 参考技术B gpu自动根据缩放比例进行选择 参考技术C 不会

EGL错误:“纹理资源为NULL,未指定级别”

我收到EGL错误:EGL错误:type = 0x824c,severity = 0x9146,message =“纹理资源为NULL,未指定级别”

在下面的前3行代码中为texId1执行glTextSubImage时会出现此错误。 texId2没有错误。想知道是否有其他人对这个错误可能是什么有任何想法?

在debugMessagecallback中可以看到此错误,并且关联的glGetError()是GL_INVALID_OPERATION。

   //render loop
   glBindTexture(GL_TEXTURE_2D, (GLuint)texId1);
   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_textureWidth,    g_textureHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelsdata1);

   glBindTexture(GL_TEXTURE_2D, 0); //unbind tex


   glBindTexture(GL_TEXTURE_2D, (GLuint)texId2);
   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_textureWidth,      g_textureHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelsdata2);

   glBindTexture(GL_TEXTURE_2D, 0); //unbind tex

答案

好的,这是发生了什么,因此选择这个作为这篇文章的自我答案。我创建纹理的统一代码,我也尝试将其默认为白色。我这样做是通过分配m_tex = Texture2D.whiteTexture来实现的。意图是做一些像m_tex.whiteTexture;这是不允许的,所以最终我去了:-)

在引擎盖下看起来Unity正在使用我在意外重建的Texture2D.whiteTexture上的glTexStorage2D()调用,使其不可变。事实上,我必须调整原始tex的大小,这对我来说很明显,我得到了一个新的纹理而不是颜色变化,但是我专注于解释我的本机代码中的gl调用和错误代码。评论这些whiteTexture并调整大小后不再出现gl错误:

m_tex = new Texture2D(1920, 1080, TextureFormat.RGBA32, false);
m_tex.filterMode = FilterMode.Bilinear;

//m_tex = Texture2D.whiteTexture;
//m_tex.Resize(1920, 1080);
m_tex.Apply();

还有一个注意事项我继续使用glTexSubImage2D调用,其中pixeldata与上面的原始帖子中的同一个调用中传递。我不使用glTexImage。我猜Unity在所有纹理创建上使用ARB_texture_storage extension,从而使这些纹理不可变。这是扩展中的注释:

When using this extension, it is no longer possible to supply texture
data using TexImage*. Instead, data can be uploaded using TexSubImage*,
or produced by other means (such as render-to-texture, mipmap generation,
or rendering to a sibling EGLImage).

谢谢你@ Rabbid76和@solidpixel。我相信所有评论都会对其他人有用。干杯:-)

以上是关于最后显示mipmap某一级别纹理时 这个级别是gpu选择的还是写的渲染程序里设置的的主要内容,如果未能解决你的问题,请参考以下文章

所有 OpenGL 纹理调用中使用的“级别”参数到底是啥?

OpenGL RGB DXT1压缩纹理mipmap上传

GL_DEPTH_TEST导致闪烁

手动生成 mipmap

游戏美术中最常见的故障及其解决方案

游戏美术中最常见的故障及其解决方案