You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:50:39