从Unity导入的纹理未显示OpenGL

时间:2019-07-16 21:28:23

标签: c++ unity3d opengl textures

我正在尝试使相机的渲染纹理统一化,并显示在我的opengl窗口三角形上。我可以显示规则的纹理,但是统一会导致黑屏。

这里是一次运行的函数:

extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API createSimpleWindow()
{

    if (std::this_thread::get_id() == MAIN_THREAD_ID)
    {


        newContext = glfwCreateWindow(640, 480, "window", NULL, oldContext);
        glfwMakeContextCurrent(newContext);
        //drawing triangle
        // start GLEW extension handler
        glewExperimental = GL_TRUE;
        glewInit();
        // tell GL to only draw onto a pixel if the shape is closer to the viewer
        glEnable(GL_DEPTH_TEST); // enable depth-testing
        glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
//triangle pts
        float points[] = {
            0.0f,  0.5f,  0.0f,     0.5f, 1.0f,
            0.5f, -0.5f,  0.0f,     1.0f, 0.0f,
            -0.5f, -0.5f,  0.0f,    0.0f, 0.0f
        };
        GLuint vbo = 0;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, 15 * sizeof(float), points, GL_STATIC_DRAW);

         vao = 0;
        glGenVertexArrays(1, &vao);
        glBindVertexArray(vao);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
        glEnableVertexAttribArray(1);

        GLuint vs = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vs, 1, &vertex_shader, NULL);
        glCompileShader(vs);
        GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fs, 1, &fragment_shader, NULL);
        glCompileShader(fs);

        shader_programme = glCreateProgram();
        glAttachShader(shader_programme, fs);
        glAttachShader(shader_programme, vs);
        glLinkProgram(shader_programme);
         glUseProgram(shader_programme);
        ////////////////////////////
        //unity texture
        void* textureDataPtr = s_CurrentAPI->BeginModifyTexture(g_TextureHandle, g_TextureWidth, g_TextureHeight, &textureRowPitch);

        if (textureDataPtr) {
            writeToLog("data contained from unity!!!!!!");
        }

        //regular texture
        int width, height, nrComponents;
        unsigned char *data = stbi_load("/Users/roma/Desktop/Escape Tech/BitBucketRepos/blankpluginGLFW/BlankPlugin/PluginSource/source/container2.png", &width, &height, &nrComponents, 4);

       //set up texture
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);

        //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_TextureWidth, g_TextureHeight, GL_RGBA, GL_UNSIGNED_BYTE, textureDataPtr);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureDataPtr);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

        glUniform1i(glGetUniformLocation(shader_programme, "texture1"), 0);


        //s_CurrentAPI->EndModifyTexture(g_TextureHandle, g_TextureWidth, g_TextureHeight, textureRowPitch, textureDataPtr);

        //////////////////////////////////
        glfwSetKeyCallback(newContext, key_callback);
    }
    else
    {
        writeToLog("not main thread");
    }
}
void* RenderAPI_OpenGLCoreES::BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch)
{
    const int rowPitch = textureWidth * 4;
    // Just allocate a system memory buffer here for simplicity
    unsigned char* data = new unsigned char[rowPitch * textureHeight];
    *outRowPitch = rowPitch;
    return data;
}

当我执行“ if(textureDataPtr)”写入日志时,它会正确写入,因此我知道有一些数据没有显示。

任何帮助将不胜感激!

0 个答案:

没有答案
相关问题