Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对图像使用片段着色器_C++_Opencv_Opengl - Fatal编程技术网

C++ 如何对图像使用片段着色器

C++ 如何对图像使用片段着色器,c++,opencv,opengl,C++,Opencv,Opengl,我正在尝试使用GLSL(orange book)执行简单的颜色校正操作 我正在努力将着色器应用于图像。这是我用来调整饱和度的碎片着色器,从橘子皮书里偷来的。我不明白如何在图像中使用这个 const vec3 lumCoeff = vec3(0.2125,0.7154,0.0721); uniform float Alpha; void main() { vec3 intensity = vec3(dot(gl_Color.rgb, lumCoeff)); vec3 color

我正在尝试使用GLSL(orange book)执行简单的颜色校正操作

我正在努力将着色器应用于图像。这是我用来调整饱和度的碎片着色器,从橘子皮书里偷来的。我不明白如何在图像中使用这个

const vec3 lumCoeff = vec3(0.2125,0.7154,0.0721);
uniform float Alpha;

void main()
{
    vec3 intensity = vec3(dot(gl_Color.rgb, lumCoeff));
    vec3 color = mix(intensity, gl_color.rgb, Alpha);
    gl_FragColor = vec4(color, 1.0);
}
然后我的顶点着色器是

void main(void)
{
    gl_Position = ftransform();
}

我一直在尝试使用OpenCV来读取图像,然后我用<代码> GLTEXIGE2D2/代码>将其变成纹理,但是我不理解如何在OpenGL和C++中使用着色器。 何时以及如何将着色器应用于图像

下面是我试图运行的代码

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

//#include <GL/glew.h>
#include <GLUT/glut.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include "textfile.h"

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#define VIEWPORT_WIDTH              320 // 1280
#define VIEWPORT_HEIGHT             320 // 800

IplImage *Image;
static GLuint texName;
GLuint v,f,f2,p;
float lpos[4] = {1,0.5,1,0};

void changeSize(int w, int h) {

    // Prevent a divide by zero, when window is too short
    // (you cant make a window of zero width).
    if(h == 0)
        h = 1;

    float ratio = 1.0* w / h;

    // Reset the coordinate system before modifying
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // Set the viewport to be the entire window
    glViewport(0, 0, w, h);

    // Set the correct perspective.
    gluPerspective(45,ratio,1,1000);
    glMatrixMode(GL_MODELVIEW);


}


void renderScene(void) {

    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);

    glGenTextures(1, &texName);
    glActiveTexture(GL_TEXTURE0);
    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);
    glPixelStorei (GL_UNPACK_ALIGNMENT,  Image->align);
    glPixelStorei (GL_UNPACK_ROW_LENGTH, Image->widthStep / Image->nChannels);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, Image->width, Image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, Image->imageData);
    glViewport(0, 0, VIEWPORT_WIDTH , VIEWPORT_HEIGHT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, VIEWPORT_WIDTH , 0, VIEWPORT_HEIGHT, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    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, texName);
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    glTexCoord2f(0, 1); glVertex3f(0, VIEWPORT_HEIGHT, 0);
    glTexCoord2f(1, 1); glVertex3f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT, 0);
    glTexCoord2f(1, 0); glVertex3f(VIEWPORT_WIDTH, 0, 0);
    char *vs = NULL,*fs = NULL,*fs2 = NULL;

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


    vs = textFileRead("toon.vert");
    fs = textFileRead("toon.frag");
    //fs2 = textFileRead("toon2.frag");

    const char * ff = fs;
    //const char * ff2 = fs2;
    const char * vv = vs;

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

    free(vs);free(fs);

    glCompileShader(v);
    glCompileShader(f);
    //glCompileShader(f2);

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

    glLinkProgram(p);
    glUseProgram(p);
    glEnd();
    glFlush();
    glDisable(GL_TEXTURE_2D);

    // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // glLoadIdentity();
    // gluLookAt(0.0,0.0,5.0, 
    //        0.0,0.0,-1.0,
    //        0.0f,1.0f,0.0f);

    // glLightfv(GL_LIGHT0, GL_POSITION, lpos);
    // glutSolidTeapot(1);

    glutSwapBuffers();
}

void processNormalKeys(unsigned char key, int x, int y) {

    if (key == 27) 
        exit(0);
}


void setShaders() {

    char *vs = NULL,*fs = NULL,*fs2 = NULL;

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


    vs = textFileRead("toon.vert");
    fs = textFileRead("toon.frag");
    //fs2 = textFileRead("toon2.frag");

    const char * ff = fs;
    //const char * ff2 = fs2;
    const char * vv = vs;

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

    free(vs);free(fs);

    glCompileShader(v);
    glCompileShader(f);
    //glCompileShader(f2);

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

    glLinkProgram(p);
    glUseProgram(p);
}


int main(int argc, char **argv) {

    Image = cvLoadImage("lena.tiff",1);

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(320,320);
    glutCreateWindow("MM 2004-05");

    glutDisplayFunc(renderScene);
    glutIdleFunc(renderScene);
    glutReshapeFunc(changeSize);
    glutKeyboardFunc(processNormalKeys);

    glEnable(GL_DEPTH_TEST);
    glClearColor(1.0,1.0,1.0,1.0);
//  glEnable(GL_CULL_FACE);

    // glewInit();
    // if (glewIsSupported("GL_VERSION_2_0"))
    //  printf("Ready for OpenGL 2.0\n");
    // else {
    //  printf("OpenGL 2.0 not supported\n");
    //  exit(1);
    // }
    //setShaders();

    glutMainLoop();

    // just for compatibiliy purposes
    return 0;
}
#包括
#包括
#包括
//#包括
#包括
#包括
#包括
#包括“textfile.h”
#包括
#包括
#包括
#包括
#包括
#定义视口宽度320//1280
#定义视口高度320//800
IplImage*图像;
静态GLuint-texName;
胶合v,f,f2,p;
浮点LPO[4]={1,0.5,1,0};
无效更改大小(整数w、整数h){
//当窗口太短时,防止被零除
//(您不能制作零宽度的窗口)。
如果(h==0)
h=1;
浮球比=1.0*w/h;
//修改前重置坐标系
glMatrixMode(GL_投影);
glLoadIdentity();
//将视口设置为整个窗口
glViewport(0,0,w,h);
//设置正确的透视图。
(45,比率11000);
glMatrixMode(GLU模型视图);
}
void renderScene(void){
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GLU平面);
glEnable(GLU深度试验);
glGenTextures(1,&texName);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,texName);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_重复);
glTexParameteri(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
glPixelStorei(GL_解包_对齐,图像->对齐);
glPixelStorei(GL_解包_行长度,图像->宽度步长/图像->通道);
GLTEXAGE2D(GL_纹理_2D,0,3,图像->宽度,图像->高度,0,GL_BGR,GL_无符号字节,图像->图像数据);
glViewport(0,0,视口宽度,视口高度);
glMatrixMode(GL_投影);
glLoadIdentity();
glOrtho(0,视口宽度,0,视口高度,-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glEnable(GL_纹理_2D);
glTexEnvf(GL_纹理_环境、GL_纹理_环境模式、GL_贴花);
glBindTexture(GL_TEXTURE_2D,texName);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(0,0,0);
glTexCoord2f(0,1);glVertex3f(0,视口高度,0);
glTexCoord2f(1,1);glVertex3f(视口宽度,视口高度,0);
glTexCoord2f(1,0);glVertex3f(视口宽度,0,0);
char*vs=NULL,*fs=NULL,*fs2=NULL;
v=glCreateShader(GLU顶点着色器);
f=glCreateShader(GL_片段_着色器);
//f2=glCreateShader(GL_片段_着色器);
vs=textFileRead(“toon.vert”);
fs=textFileRead(“toon.frag”);
//fs2=textFileRead(“toon2.frag”);
常量char*ff=fs;
//常量字符*ff2=fs2;
常量字符*vv=vs;
glShaderSource(v,1和vv,NULL);
glShaderSource(f,1,&ff,NULL);
//glShaderSource(f2,1和ff2,NULL);
自由(vs);自由(fs);
GLE编辑主管(v);
GLE编辑主管(f);
//glCompileShader(f2);
p=glCreateProgram();
格拉塔沙德(p,f);
//格拉塔沙德(p,f2);
格拉塔沙德(p,v);
GLLINK计划(p);
glUseProgram(p);
格伦德();
glFlush();
glDisable(GL_纹理_2D);
//glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//glLoadIdentity();
//gluLookAt(0.0,0.0,5.0,
//        0.0,0.0,-1.0,
//0.0f、1.0f、0.0f);
//glLightfv(GLU LIGHT0,GLU位置,LPO);
//茶壶(1);
glutSwapBuffers();
}
void processNormalKeys(无符号字符键,int x,int y){
如果(键==27)
出口(0);
}
void setShaders(){
char*vs=NULL,*fs=NULL,*fs2=NULL;
v=glCreateShader(GLU顶点着色器);
f=glCreateShader(GL_片段_着色器);
//f2=glCreateShader(GL_片段_着色器);
vs=textFileRead(“toon.vert”);
fs=textFileRead(“toon.frag”);
//fs2=textFileRead(“toon2.frag”);
常量char*ff=fs;
//常量字符*ff2=fs2;
常量字符*vv=vs;
glShaderSource(v,1和vv,NULL);
glShaderSource(f,1,&ff,NULL);
//glShaderSource(f2,1和ff2,NULL);
自由(vs);自由(fs);
GLE编辑主管(v);
GLE编辑主管(f);
//glCompileShader(f2);
p=glCreateProgram();
格拉塔沙德(p,f);
//格拉塔沙德(p,f2);
格拉塔沙德(p,v);
GLLINK计划(p);
glUseProgram(p);
}
int main(int argc,字符**argv){
Image=cvLoadImage(“lena.tiff”,1);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_深度| GLUT_双精度| GLUT_RGBA);
位置(100100);
glutInitWindowSize(320320);
玻璃窗(“MM 2004-05”);
glutDisplayFunc(渲染场景);
glutIdleFunc(渲染场景);
GLUTEFUNC(更改大小);
glutKeyboardFunc(processNormalKeys);
glEnable(GLU深度试验);
glClearColor(1.0,1.0,1.0,1.0);
//glEnable(GL_CULL_面);
//glewInit();
//如果(受支持(“GL\U版本\U 2\U 0”))
//printf(“准备好使用OpenGL 2.0\n”);
//否则{
//printf(“不支持OpenGL 2.0”);
//出口(1);
// }
//设置阴影();
glutMainLoop();
//只是为了兼容
返回0;
}

您尚未向着色器传递任何统一采样器

嗯,有很多事情你应该注意

  • 您不需要在渲染循环中转储所有初始化代码。你只是在扼杀你的程序。 就像这个纹理生成代码。它只需要执行一次。只需将其移动到某个init()函数

    glGenTextures(1, &texName);
    glActiveTexture(GL_TEXTURE0);
    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);
    glPixelStorei (GL_UNPACK_ALIGNMENT,  Image->align);
    glPixelStorei (GL_UNPACK_ROW_LENGTH, Image->widthStep / Image->nChannels);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, Image->width, Image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, Image->imageData);
    
  • 然后这个着色器程序创建,编译和链接这个
    char *vs = NULL,*fs = NULL,*fs2 = NULL;
    
    v = glCreateShader(GL_VERTEX_SHADER);
    f = glCreateShader(GL_FRAGMENT_SHADER);
    //f2 = glCreateShader(GL_FRAGMENT_SHADER);
    
    
    vs = textFileRead("toon.vert");
    fs = textFileRead("toon.frag");
    //fs2 = textFileRead("toon2.frag");
    
    const char * ff = fs;
    //const char * ff2 = fs2;
    const char * vv = vs;
    
    glShaderSource(v, 1, &vv,NULL);
    glShaderSource(f, 1, &ff,NULL);
    //glShaderSource(f2, 1, &ff2,NULL);
    
    free(vs);free(fs);
    
    glCompileShader(v);
    glCompileShader(f);
    //glCompileShader(f2);
    
    p = glCreateProgram();
    glAttachShader(p,f);
    //glAttachShader(p,f2);
    glAttachShader(p,v);
    
    glLinkProgram(p);