Unity插件在OpenGL 4.1中不起作用,使用OpenGL 2.1

时间:2016-11-10 14:49:37

标签: c# c opengl unity3d

我有一个关于我正在编写的小型Unity插件的问题。

该插件采用Unity3D Texture2D并尝试更新它,编译后的插件在运行带有-force-opengl的Unity3D时运行(在OpenGL 2.1中运行),但在正常模式(OpenGL 4.1)下运行时它不起作用。有什么我想念的吗?

插件应该更新内部OpenGL纹理并设置它的数据。该插件不会使游戏或其他任何内容崩溃,但在2.1上运行时纹理会更新,但在4.1中只显示灰色纹理

在Unity自己的示例中,他们使用GLEW初始化OpenGL上下文(https://bitbucket.org/Unity-Technologies/graphicsdemos/src/548c5251ddbe82129b2584992a0f50caa4c34c6c/NativeRenderingPlugin/PluginSource/source/RenderAPI_OpenGLCoreES.cpp?at=default&fileviewer=file-view-default) 但是插件中是否应该存在OpenGL上下文? OpenGL版本之间有什么区别吗?

我在OSX El Capitan上运行。

以下是相关的代码段:

C插件代码

#include <stdio.h>
#include <inttypes.h>

#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

#include "unity/IUnityInterface.h"

#include "debug.c"

void RenderTexture (void* texId, int time) {
    GLuint gltex = (GLuint)(size_t)(texId);

    int id, i, j;
    GLubyte img[64 * 64 * 4];

    for (i = 0; i < 64; i++) {
        for (j = 0; j < 64; j++) {
            id = (4 * j) + (4 * 64 * i);
            img[id] = (GLubyte) time % 255;
            img[id + 1] = (GLubyte) time % 255;
            img[id + 2] = (GLubyte) (255 - time) % 255;
            img[id + 3] = (GLubyte) (255 - time) % 255;
        }
    }

    glBindTexture(GL_TEXTURE_2D, gltex);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 64, 64, GL_RGBA, GL_UNSIGNED_BYTE, img);
}

C#Unity代码

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System;
using System.IO;

public class TestBehaviour : MonoBehaviour {

    [DllImport("main")]
    private static extern void RenderTexture (IntPtr ptrTexture, int time);

    Texture2D tex;

    void Start () {
        tex = new Texture2D (64, 64, TextureFormat.ARGB32, false);
        tex.Apply ();

        GetComponent<Renderer> ().material.SetTexture ("_MainTex", tex);
    }

    void Update () {
        RenderTexture (tex.GetNativeTexturePtr (), (int)Time.realtimeSinceStartup * 10);
    }

}

3 个答案:

答案 0 :(得分:2)

查看the docs,似乎在Unity中使用-force-opengl使用旧版OpenGL。尝试使用-force-glcore,看看你是否得到了不同的结果。

答案 1 :(得分:0)

如果您将该命令置于条件状态,如

,该怎么办?
if (version <= 2.1) then       -force-opengl

所以,它不会在新的 OpenGL

中执行

答案 2 :(得分:0)

我不会假装真正的帮助,但我不能发表评论,所以。

首先要说的是:在C#代码中使用ARGB格式和在C代码中使用RGBA是多么奇怪。错误或我得错了什么?

第二件事 - 你甚至都没有试图理解究竟出了什么问题 使用GLenum error = glGetError();获取OpenGL状态机中发生的最新错误,然后查看glTexSubimage2d documentation以查看可能的错误及其原因列表。遵循这些简单的步骤可能会帮助您理解您做错了什么,如果您没有做错任何事,那么它就是Unity方面的问题。

事实上,这个问题有很多可能的原因,没有glError信息只会让你无法进一步调查。