Unity VR头显中GL绘制三角形显示重影问题求助
解决Unity VR中GL绘图颜色失效与重影问题
问题分析
你遇到两个核心问题:
GL.Color(Color.red)不生效,绘制出白色三角形:这是因为GL默认没有绑定支持顶点颜色的材质,默认渲染状态会忽略顶点颜色设置。- VR头显中出现重影:VR采用左右眼分屏渲染,你用
GL.LoadOrtho()加载的是全局正交矩阵,没有适配左右眼各自的视口与投影变换,导致同一个图形被两个相机重复绘制,位置偏移产生重影。
解决方案
1. 修复颜色失效问题
创建一个Unlit/Color类型的材质(Unity编辑器中右键→Create→Material,Shader选择Unlit/Color),在代码中绑定该材质并激活其渲染通道,让GL.Color的设置生效。
2. 修复VR重影问题
弃用全局的GL.LoadOrtho(),基于当前正在渲染的相机(VR左右眼相机)的投影与视图矩阵设置GL变换,或者将屏幕视口坐标转换为世界坐标,确保左右眼各自渲染正确的区域。
修改后的完整代码
using UnityEngine; public class VRGLDrawing : MonoBehaviour { public Material unlitColorMat; // 在Inspector面板中赋值你创建的Unlit/Color材质 void OnPostRender() { if (unlitColorMat == null) { Debug.LogError("请为unlitColorMat赋值Unlit/Color材质"); return; } GL.PushMatrix(); // 适配VR左右眼相机的投影与视图矩阵 GL.LoadProjectionMatrix(Camera.current.projectionMatrix); GL.modelview = Camera.current.worldToCameraMatrix; // 激活材质渲染通道,让顶点颜色生效 unlitColorMat.SetPass(0); GL.Begin(GL.TRIANGLES); GL.Color(Color.red); // 将视口坐标转换为世界坐标,确保在VR左右眼中位置正确 Vector3 vertex1 = Camera.current.ViewportToWorldPoint(new Vector3(0.25f, 0.25f, Camera.current.nearClipPlane)); Vector3 vertex2 = Camera.current.ViewportToWorldPoint(new Vector3(0.5f, 0.75f, Camera.current.nearClipPlane)); Vector3 vertex3 = Camera.current.ViewportToWorldPoint(new Vector3(0.75f, 0.25f, Camera.current.nearClipPlane)); GL.Vertex(vertex1); GL.Vertex(vertex2); GL.Vertex(vertex3); GL.End(); GL.PopMatrix(); } }
额外注意事项
- 将脚本挂到VR的左右眼相机上,或者主相机上(Unity的VR系统会自动让主相机的
OnPostRender在左右眼渲染时分别触发)。 - 如果仅需要绘制纯2D屏幕图形,也可以直接使用Unity的UI Canvas系统,开发效率更高;若必须使用GL绘图,上述方法可解决现有问题。
内容的提问来源于stack exchange,提问作者aarelovich
相关产品推荐
相关产品推荐

