我有一个关于我正在编写的小型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);
}
}
答案 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信息只会让你无法进一步调查。