精华内容
下载资源
问答
  • Unity3D调用Native OpenGL,Unity3D支持调用C++工程的OpenGL渲染,使用RenderingPlugin DLL方式。
  • OpenGL】使用Unity来学习OpenGL

    万次阅读 2013-09-09 22:39:53
    OpenGL是原理性和实践性比较强的一门技术,在学习的时候,如果能够跟着书中的例子,一边调试一边学习,效果将很好(这属于实验的一种类型吧,能够吧知识形象化,有助于学习兴趣的提高)。市面上有许多深入浅出的书籍...

    转发,请保持地址:http://blog.csdn.net/stalendp/article/details/11492525

    OpenGL是原理性和实践性比较强的一门技术,在学习的时候,如果能够跟着书中的例子,一边调试一边学习,效果将很好(这属于实验的一种类型吧,能够吧知识形象化,有助于学习兴趣的提高)。市面上有许多深入浅出的书籍讲的很好,比如《OpenGL SuperBible 5th Edition》、《OpenGL 4 Shanding Language Cookbook》等(前者的例子代码写的非常好,后者把OpenGL的原理讲的比较深入)。不过把这些书中的代码跑在特定的系统上,还是需要花一些代价的(比如在mac上,SLGL只支持到1.2,很多例子中的代码就需要改了;而且配置环境也是比较麻烦的)。在探寻了很久之后,发现Unity3D提供了很好的OpenGL的学习环境,并且还有一些很好的资料可以参考(强烈推荐Kenny Lammers的《Unity Shaders and Effects Cookbook)。本文将介绍怎么在Unity3D上学习SLGL(关于OpenGL的pipeLine、VBO、PBO等其他一些,可以参考上面推荐的两本书,特别是把《OpenGL SuperBible 5th Edition》的那套工具类搞懂,就非常OK了)。这片文章源于对Minimal Shader的一个翻译和整理。

    一、配置启动项(只有windows上需要)

    在Unity3d的桌面图标的属性中(右击图标选择属性,弹出的对话框中),在“目标”属性中,添加启动参数“-force-opengl”,变为如下:
    "C:\Program Files\Unity\Editor\Unity.exe" -force-opengl

    二、创建Shader

    1. 创建一个新项目,在界面下方的Project面板中,选择Create->Shader,创建一个Shader,并命名为Test01,如下图:

    2。双击Shader01,打开MonoDevelop编辑器,把下面的代码替换原来的,并保存:
    Shader "GLSL basic shader" { // defines the name of the shader 
       SubShader { // Unity chooses the subshader that fits the GPU best
          Pass { // some shaders require multiple passes
             GLSLPROGRAM // here begins the part in Unity's GLSL
     
             #ifdef VERTEX // here begins the vertex shader
     
             void main() // all vertex shaders define a main() function
             {
                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
                   // this line transforms the predefined attribute 
                   // gl_Vertex of type vec4 with the predefined
                   // uniform gl_ModelViewProjectionMatrix of type mat4
                   // and stores the result in the predefined output 
                   // variable gl_Position of type vec4.
             }
     
             #endif // here ends the definition of the vertex shader
     
     
             #ifdef FRAGMENT // here begins the fragment shader
     
             void main() // all fragment shaders define a main() function
             {
                gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
                   // this fragment shader just sets the output color 
                   // to opaque red (red = 1.0, green = 0.0, blue = 0.0, 
                   // alpha = 1.0)
             }
     
             #endif // here ends the definition of the fragment shader
     
             ENDGLSL // here ends the part in GLSL 
          }
       }
    }
    这样Shader就编辑好了。观察一下发现,这里一个文件中包含了Vertex Shader和Fragment Shader,这个有别于GLSL,不过其他就没有变化了(以后可能会有些优化,比如varying变量,在传统的GLSL中,需要在Vertex和Fragment中都定义一下,而且变量名称要一致,在Unity中可以把varying变量起到前面,写一份就可以了,减少了代码编写和错误的发生)

    三、创建材质并绑定Shader

    像创建Shader一样,创建材质,如下图:

    方法一:把Shader,拖动到材质球上完成绑定,这样球变色了,如下:

    方法二:选择材质球,在右边的Inspector中改变其Shader,如下图:

    其中“GLSL basic Shader”为刚刚定义的Shader的名称:
    Shader "GLSL basic shader" { // defines the name of the shader 
       SubShader { // Unity chooses the subshader that fits the GPU best
    。。。。。

    四、把材质赋予游戏物体

    在编写Shader时候,一般观察材质球,就可以了解shader的效果了(选择材质,在右下角的Preview中显示);材质可以为球、立方体、圆柱体、环体,点击Preview窗口标题栏靠左的按钮可以进行切换,如下图:

    而材质最终还是要赋予游戏物体的(游戏物体可以有多种形状,可以方便观察shader的效果);
    1. 创建物体(这里将使用Unity预定义物体),点击菜单,如下:

    然后在右上的Hierarchy中选择刚创建的Sphere,把鼠标移到Scene窗口,按键盘上的f,使得物体调整到最佳位置和大小。然后把材质拖动到物体上,如下图:


    OK,到此为止,OpenGL的学习环境已经搭建好,然后推荐深入学习GLSL的教程: GLSL/Unity; 当然在其页面上也有pdf下载对应的pdf下载连接。
    当然,Unity中不怎么推荐使用GLSL,取而代之的是Nvidia的cg,可以参考: http://en.wikibooks.org/wiki/Cg_Programming/Unity,教程结构是一样的,所以后续学起来应该还是比较轻松的,也可以参考着学习
    这个GLSL教程还有关于Blender的,有兴趣的同学可以去参考一下: http://en.wikibooks.org/wiki/GLSL_Programming
    另外,官方也有shader的相关例子: http://wiki.unity3d.com/index.php/Shaders

    ----

    关于OpenGL的资料:

    Learning Modern 3D Graphics Programming

    OpenGL Programming

    Anton's OpenGL 4 Tutorials

    一个开发者的博客:One-minute Dungeon: Behind the scenes

    游戏中法线贴图的技巧:A game of Tricks-Normal mapped Scripts


    参考:


    ================
    更多高级的Shader知识
    =================
    GPU Gems:
    其他书籍的索引: http://www.douban.com/doulist/1445745/

    展开全文
  • Unity3d 图形学之OpenGL渲染流程(一)

    千次阅读 2019-03-11 15:40:59
    游戏开发中经常需要平衡GPU和CPU的性能消耗 比如游戏加载时的 Loading 界面,往往伴随着资源请求(网络请求数据和本地请求资源),这些请求很消耗CPU的资源,如果Loading也放在CPU做的话会抢占CPU...OpenGl 渲染...

    游戏开发中经常需要平衡GPU和CPU的性能消耗

    比如游戏加载时的 Loading 界面,往往伴随着资源请求(网络请求数据和本地请求资源),这些请求很消耗CPU的资源,如果Loading也放在CPU做的话会抢占CPU资源,就使得当前界面会变的非常卡顿,所以我们要在CPU忙的时候,通过GPU来分担一下工作。

    Loading 做法:利用CPU 做若干图交替   ;利用GPU旋转

    OpenGl 渲染流程:Cpu和Gpu:

    Cpu:

    Fbx加载到内存中去,然后通过Mesh render渲染出来(通过Fbx加载顶点等信息传给Mesh'render)

     

    Gpu:

       渲染管线(管道):顶点着色器——>光栅化——>片段着色器——>alpha测试——>模版测试——>深度测试——>Blend——>Gbuffer——>BrontBuffer——>framebuffer——>显示器

    顶点着色器:

    1.计算顶点的颜色;2. 将物体坐标系转换到相机坐标系;

    光栅化:

    将顶点转换成像素,一 一对应

    比如Unity渲染一个Quad物体,如下Quad有四个顶点

    假设Quad像素为100*100

     

    片段着色器:

    1.此时顶点已经是像素点(像素:一般有RGBA 4通道组成   RGBA  8888表示每个通道占8bit ,32位刚好用float )

    比如 屏幕  1080*1920  横有 1080个像素,竖有1920个像素,float[1080*1920]


    Quad有4个顶点到了   片段着色器  就变成了 100*100(即顶点着色器运行4次,片段着色器运行10000次)

    顶点着色器  与片段着色器   运算次数不是一个量级的,所以能把运算放在顶点着色器里就尽量放在里面。

    片段着色器主要做些什么呢?

    1.纹理采样 即给Quad赋予贴图或材质球,把纹理像素付给原来的像素,把原来的像素覆盖掉了。

                ———————— >  

    2. 像素跟灯光进行计算。

    alpha测试:挑选合格的alpha像素显示。(RGBA)

    模版测试:  像素还可以携带 模板信息 达到条件的模板值会显示出来 

    深度测试:符合条件的(一般是像素距离相机的距离)像素 就通过,不然就丢弃

    以上三个测试 决定像素能否被显示出来,挑选合格的像素

    Blend:将当前 要 渲染的像素 和 已经渲染出来的像素混合运算

    GBuffer :一个像素 存的(RGBA 模板值  深度值 )等信息,只要是审核通过了以后

    Gbuffer做的中转把这些信息传给FrontBuffer 

    Buffer其实是缓存区)Float[720*1280*4]数组存的信息比较多。

    Front Buffer:由Gbuffer往Front Buffer写完以后,Front Buffer推向显示器显示过程中,Front Buffer

    此时此刻就变成了FrameBuffer,同时

    由Gbuffer往Front Buffer写完以后,FrameBuffer会交换到后面去变成Front Buffer

    Float[720*1280]缓存区

    FrameBuffer:

    Float[720*1280]缓存区

    其实 Front Buffer和FrameBuffer在交替显示,一帧帧的看着好像在动一样,所以两个是相对的。

     

    相关知识借鉴:http://video.mobiletrain.org/course/index/courseId/535?pinzhuanbdtg=biaoti

     

     

     

    展开全文
  • 主要代码如下 : IEnumerator Start() { Image_left = new Texture2D(m_videoWidth, m_videoHeight, TextureFormat.ARGB32, false); //在Unity中创建2D纹理 Image_left.filterMode = FilterMode.Point; ...

    主要代码如下 :

    IEnumerator Start()

        {
            Image_left = new Texture2D(m_videoWidth, m_videoHeight, TextureFormat.ARGB32, false);     //在Unity中创建2D纹理
            Image_left.filterMode = FilterMode.Point;                                                                                       //设置参数
            Image_left.Apply();
            GetComponent<Renderer>().material.SetTexture("_mainTex", Image_left);
            GetComponent<Renderer>().material.SetFloat("_tex_start", 0.0f);
            GetComponent<Renderer>().material.SetFloat("_tex_end", 1.0f);
            GetComponent<Renderer>().material.SetFloat("_tex_offset", 0.0f);


            NativeLib.SetCamTex(Image_left.GetNativeTexturePtr());   //自定义的一个dll插件Nativelib,功能是将Image_left的纹理指针传递到openGL中

         
            yield return StartCoroutine("CallPluginAtEndOfFrames");
        
        }


        private IEnumerator CallPluginAtEndOfFrames()
        {
            while (true)
            {
                // Wait until all frame rendering is done
                yield return new WaitForEndOfFrame();
                GL.IssuePluginEvent(1);     //重点!!!绘图线程将隐式调用插件DLL中的UnityRenderEvent
            }

        }

     

    /***************************nativelib***********************/

    static void* m_TexturePointer ;

    void _DLLExport SetCamTex(void* texturePtr){

        m_TexturePointer = texturePtr;

    }

     

    void _DLLExport UnityRenderEvent(int eventID){

        glDisable(GL_CULL_FACE);

        ...//这里是openGL的东西,随便你设置了

        DoRending();   //自定义的渲染函数

    }

     

    void DoRending(){

        GLuint glTex = (GLuint)(size_t)(m_TexturePointer);//获取纹理指针,下面都是openGL的那一套

        glBindTexture(GL_TEXTURE_2D,glTex);

        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_Tex.data);

    }

    展开全文
  • OpenGLunity 3D

    2020-07-01 16:04:05
    OpenGL用于图像,unity 3D是游戏引擎,后者可能用到前者的算法。

    OpenGL用于图像,unity 3D是游戏引擎,后者可能用到前者的算法。

    展开全文
  • Unity中简单使用Opengl

    2019-09-29 20:39:30
    由于项目特殊需求,需要在unity中使用一些OpenGL的东西来绘制图形(PS:其实就是有一个拖尾算法只有OpenGL版本~~~懒得改了,直接在unity中使用OpenGL算了)。所以琢磨咯下如何在unity中使用OpenGL,刚找到点入门级的...
  • 这个文章是针对Unity 制作的Android程序 java代码部分获取到图片数据,如果要传递到unity,应该怎么做呢? 首先说一下为啥会有这个需求: 如果Unity程序需要外接一些图像设备,例如外接红外摄像头。Unity并不能...
  • OpenGL渲染流程图示 按照上图简单分析一下: CPU的工作:通过读取模型数据(.Obj文件存储模型顶点信息,模型UV信息,模型顶点索引信息)传递给GPU。 GPU的工作:顶点着色器 -->>光栅化 -->> 片段着色器...
  • unity3d 获取OpenGL版本号 android

    千次阅读 2019-07-09 17:43:10
    unity3d 获取OpenGL版本号 android opengl3.0 返回值为30000 废话不多直接上代码 public static string GetOpenGL() { string version = "0"; #if (UNITY_ANDROID && !UNITY_EDITOR) || ANDROID_CODE_...
  • 如果在Windows下能直接测试shader在安卓环境下的兼容性就再好不过了,安卓是基于OpenGLES渲染的,理论上在桌面上完全可以模拟。感谢不是UWA热心群友不是董夕提供的方法,确实能够修改Unity的渲染底层。这种方法虽好...
  • Unity Direct3D 和 OpenGL

    2020-03-17 14:10:39
    Direct3D和 OpenGL Direct3D OpenGl 图形接口Api 发行 微软 通用的 可用于 Windows Windows、Ios、Linux、Android GPU编程语言 语言 支持 HLSL Direct3D cg...
  • Unity GPU Query OpenGLES 3.0

    2019-09-28 22:33:24
    上面这个是unity的gpue query插件 export了unity里面的几个接口 要编个.so文件 看了一圈gpu query下来发现并没有 我记忆中的tag/ma...
  • OpenGL ES 学习教程(十七) Unity GPU Instance 原理及 GLES 实现(一)
  • opengl方式打开unity

    千次阅读 2014-09-11 20:40:24
    "C:\Program Files (x86)\Unity\Editor\Unity.exe" -force-opengl
  • Unity 渲染需要两个组件 Mesh Filter 和 Mesh Renderer Mesh Filter : 存储一个Mesh(网格,模型的网格,就是模型的由哪些三角面组成,组成一个什么样子的模型,三角...
  • 最近在做增强现实的项目,在识别出物体特征点后,叠加三维指示图形,需要用到后期渲染。 经过初步筛选,待选的方案...2,采用OpenGL, 利用跨平台的opengl api绘制三维图形。 3,采用Unity3d或unreal引擎。 4、其他
  • OpenGL方式运行Unity

    2016-08-10 09:48:00
    Unity在Windows上默认以DirextX的方式运行,在MacOS和Linux上默认以OpenGl的方式运行, 如果希望在Windows上以OpenGL的方式运行可以在命令行中输入 -force-opengl启动Unity 转载于:...
  • OpenGL ES 学习教程(十七) Unity GPU Instance 原理及 GLES 实现(二)
  • Unity3d OpenGL_pdf

    2016-01-27 11:58:46
    Unity3d OpenGL_pdf
  • Unity Shader学习5 —— Cg语言的基础

    万次阅读 多人点赞 2016-06-14 16:35:15
    我们知道了进行Shader编程的Shader Lab语言有三种,分别是:OpenGL的GLSL、Direct3D的HLSL和NAVIDIA公司的Cg语言。  由于Cg编写的程序可以不作任何处理就能同时在OpenGL和Direct3D上运行,所以我选择了Cg作为开发...
  • Unity3D中的RenderTexture详解

    万次阅读 2018-07-04 23:16:30
    那么unity的RenderTexture正是第三种方式的一种实现,它定义了在server-side的一个tex对象,然后将渲染直接绘制到这个tex上。 这有什么用? 我们可以将场景的一些渲染结果渲染到一个tex上,这个tex可以被...
  • Unity3D调用Native OpenGL,Unity3D支持调用C++工程的OpenGL渲染,使用RenderingPlugin DLL方式。来自官网,包括Windows,Android,Linux,Ios所有平台的本地混合编程例子,版本是Unity 5.2.2f1,工程文件包括VS2013...
  • OpenGLUnity Shader常用基础面试题

    千次阅读 2018-08-06 10:13:46
    2.OpenGL的渲染流程? 读取顶点数据→执行顶点着色器→组装图元→光栅化图元→光栅化图元→执行片段着色器→写入帧缓冲区→显示在屏幕上。(不同的管线流程应该是有去别的,大体上是这样的) 3.前向渲染、延迟渲染...
  • opengl使用unity3d中的lightmap
  • Unity3D Camera设置结合OpenGL详细解读

    千次阅读 2017-03-15 00:02:24
    Unity里面的Camera是把渲染画面,最终呈现在屏幕上的最后一步操作。所有的渲染操作最终都要通过Camera在呈现。 如果用OpenGL来实现,Camera做了一下几个事情。 通过正交或是透视,剪裁平面,得到一个4x4的矩阵...
  • Unity3D 实操OpenGL函数

    千次阅读 2017-06-01 18:12:51
    今天让大家学习一下Unity3d里面的OpenGL 自带的API ,我们可以通过简单的使用OpenGL来在场景中利用相机渲染绘制图形。官方学习文档:https://docs.unity3d.com/ScriptReference/GL.html 1.第一步:通过相关官方的...
  • OpenGL】使用Unity来学习OpenGL-附件资源

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,447
精华内容 3,778
关键字:

openglunity