簡體   English   中英

OpenGL核心配置文件不會紋理四邊形

[英]OpenGL Core Profile won't texture quad

我編寫了以下代碼,以使用GLFW在兩個不同的監視器上顯示兩個圖像。 當我嘗試運行OPENGL_CORE_PROFILE時,它擰緊了並且我的圖像沒有出現。

相反,屏幕只是保持黑色。 但是,當我不使用核心配置文件時,圖像就會很好地顯示在屏幕上。 我需要使用核心配置文件,以便可以使用OpenGL 3.3和330着色器。

我當前使用的對四邊形進行紋理化的方法是錯誤的,什么是使用OpenGL 3.3進行顯示和圖像處理的最佳方法?

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

static GLuint tex_lite;
static GLuint tex_dark;

static GLuint tex_front;
static GLuint tex_back;

float ratio;
int width, height;

char *textFileRead(char *fn) {


    FILE *fp;
    char *content = NULL;

    int count=0;

    if (fn != NULL) {
        fp = fopen(fn,"rt");

        if (fp != NULL) {

      fseek(fp, 0, SEEK_END);
      count = ftell(fp);
      rewind(fp);

            if (count > 0) {
                content = (char *)malloc(sizeof(char) * (count+1));
                count = fread(content,sizeof(char),count,fp);
                content[count] = '\0';
            }
            fclose(fp);
        }
    }
    return content;
}

void printLog(GLuint obj)
{
    int infologLength = 0;
    int maxLength;

    if(glIsShader(obj))
        glGetShaderiv(obj,GL_INFO_LOG_LENGTH,&maxLength);
    else
        glGetProgramiv(obj,GL_INFO_LOG_LENGTH,&maxLength);

    char infoLog[maxLength];

    if (glIsShader(obj))
        glGetShaderInfoLog(obj, maxLength, &infologLength, infoLog);
    else
        glGetProgramInfoLog(obj, maxLength, &infologLength, infoLog);

    if (infologLength > 0)
        printf("%s\n",infoLog);
}

void image2texture(cv::Mat Image,GLuint &texName, int i)
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);

    glActiveTexture(GL_TEXTURE0+i);
    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, texName);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
                    GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
                    GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, Image.cols, Image.rows, 0, GL_BGR,
                 GL_UNSIGNED_BYTE, Image.data);
}

static void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}

GLuint linkShader(char* vert, char* frag)
{
    GLuint v,f,p;

    char *vs = NULL,*fs = NULL;

    v = glCreateShader(GL_VERTEX_SHADER);
    f = glCreateShader(GL_FRAGMENT_SHADER);

    vs = textFileRead(vert);
    fs = textFileRead(frag);

    const char * ff = fs;
    const char * vv = vs;

    glShaderSource(v, 1, &vv,NULL);
    glShaderSource(f, 1, &ff,NULL);

    free(vs);free(fs);

    glCompileShader(v);
    glCompileShader(f);

    p = glCreateProgram();
    glAttachShader(p,f);
    glAttachShader(p,v);

    glLinkProgram(p);

    return p;
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

void checkWindow(GLFWwindow* window)
{
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
}

int main(void)
{
    GLFWwindow* window_back;
    GLFWwindow* window_front;

    glfwSetErrorCallback(error_callback);

    if ( !glfwInit() )
    {
        exit(EXIT_FAILURE);
    }

    cv::Mat image_lite = cv::imread("lena.tiff");
    cv::Mat image_dark = cv::imread("lena.tiff");

    cv::flip(image_lite, image_lite, 0);
    cv::flip(image_dark, image_dark, 0);

    int count;
    GLFWmonitor** monitors = glfwGetMonitors(&count);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    if (count >= 2)
    {
        window_front = glfwCreateWindow(1680,1050,"Front Screen",monitors[0],NULL);
        window_back = glfwCreateWindow(1280,800,"Back Screen",monitors[1],NULL);
        glewInit();
    }
    else
    {
        exit(EXIT_FAILURE);
    }

    checkWindow(window_front);
    checkWindow(window_back);

    glfwMakeContextCurrent(window_front);
    glfwSetKeyCallback(window_front, key_callback);

    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
    if(err!=GLEW_OK)
    {
        std::cout<<"glewInit failed, aborting."<<std::endl;
    }

    std::cout << glGetString(GL_RENDERER) << std::endl;
    std::cout << glGetString(GL_VENDOR) << std::endl;
    std::cout << glGetString(GL_VERSION) << std::endl;
    std::cout << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;

    while (!glfwWindowShouldClose(window_front) && !glfwWindowShouldClose(window_back))
    {

        glfwMakeContextCurrent(window_front);
        glfwSetKeyCallback(window_front, key_callback);

        glfwGetFramebufferSize(window_front, &width, &height);
        ratio = width / (float) height;
        glViewport(0,0,width,height);

        image2texture(image_lite, tex_lite,0);

        // GLuint prg = linkShader("toon.vert","toon.frag");

        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio,ratio,-1.f,1.f,-1.f,1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glActiveTexture(GL_TEXTURE0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
        glBindTexture(GL_TEXTURE_2D, tex_lite);

        glBegin(GL_QUADS);
            glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,-1.0,0.0);
            glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,1.0,0.0);
            glTexCoord2f(1.0, 1.0); glVertex3f(1.0,1.0,0.0);
            glTexCoord2f(1.0, 0.0); glVertex3f(1.0,-1.0,0.0);
        glEnd();     
        glFlush();
        glfwSwapBuffers(window_front);
        glfwPollEvents();

        glfwMakeContextCurrent(window_back);
        glfwSetKeyCallback(window_back, key_callback);

        glfwGetFramebufferSize(window_back, &width, &height);
        ratio = width / (float) height;
        glViewport(0,0,width,height);

        image2texture(image_dark, tex_dark,1);

        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio,ratio,-1.f,1.f,-1.f,1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glActiveTexture(GL_TEXTURE0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
        glBindTexture(GL_TEXTURE_2D, tex_lite);

        glBegin(GL_QUADS);
            glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,-1.0,0.0);
            glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,1.0,0.0);
            glTexCoord2f(1.0, 1.0); glVertex3f(1.0,1.0,0.0);
            glTexCoord2f(1.0, 0.0); glVertex3f(1.0,-1.0,0.0);
        glEnd();
        glFlush();
        glfwSwapBuffers(window_back);
        glfwPollEvents();
    }
    glfwMakeContextCurrent(window_front);
    glfwDestroyWindow(window_front);
    glfwMakeContextCurrent(window_back);
    glfwDestroyWindow(window_back);

    glfwTerminate();
    exit(EXIT_SUCCESS);
}

您的代碼在核心配置文件中完全無效。 在核心配置文件中,實際上已刪除了許多年前已被“棄用”的所有舊功能。 不支持GL_QUADS基本類型,不支持使用glBegin()/glEnd()即時模式渲染, glEnable(GL_TEXTURE_2D); 不支持,不支持內置的頂點屬性,例如texcoord和頂點位置,並且不支持GL_TEXTURE_ENV_MODE ,不支持不GL_TEXTURE_ENV_MODE色器的渲染(“固定功能管線”)。 glMatrixMode()glLoadIdentityglOrtho()以及所有其他矩陣和矩陣堆棧相關的函數也是如此。 glTexImage2D()也不支持內部格式“ 3”,您應該使用GL_RGB (之前也應該使用)。

當您要使用現代核心配置文件時,必須使用帶有着色器且沒有所有內置屬性的可編程管道。 您可以定義自己的通用屬性。 您必須將VBO用於幾何圖形,並將VAO用於頂點指針,而不是立即模式。 您還必須用基於三角形的基元替換四基元。 您將必須使用自己的矩陣函數,或為此使用一些庫。

您可能需要看一下專門處理現代OpenGL的教程,例如arcsynthesisopen.gl。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM