glsl片段着色器黑屏

时间:2013-01-06 19:40:58

标签: c++ opengl glsl fragment-shader

我尝试创建一个有两种颜色的墙:顶部0.8,0.8,1和底部0.4,0.4,0.8,其余部分我想插入这两种颜色。

我有这些片段着色器和顶点着色器:

顶点着色器

#version 330

uniform mat4 modelMatrix,viewMatrix, projMatrix;

layout (location = 0) in vec4 position;
layout (location = 1) in vec3 color; 
out vec3 Color;

void main()
{
    Color = color;
    gl_Position = projMatrix * viewMatrix * modelMatrix * position ;
}

片段着色器

#version 330

in vec3 Color;

void main()
{

    gl_FragColor = vec4(Color,1.0);

}

我的代码的一些部分在c ++中:

unsigned int ProgramShader,VertexShader,FragmentShader;
Mode current_mode = GPU;
float verticesBackground[] = { -200.0f, -100.0f, -100.0f,
                         200.0f, -100.0f, -100.0f,
                        200.0f, 100.0f, -100.0f,
                        -200.0f, 100.0f, -100.0f  
                    };
int indexesBackground[] =   {   0 , 1 , 2 , 
                    2 , 3 , 0 
                };
float colorsBackground[] = {  0.8f, 0.8f, 1.0f, 
                    0.8f, 0.8f, 1.0f,
                    0.4f, 0.4f, 0.8f,
                    0.4f, 0.4f, 0.8f
                    };

// vao-uri
unsigned int BackgroundVao;
// vbo-uri
unsigned int BackgroundVboPositions, BackgroundVboColors;
// ibo-uri
unsigned int BackgroundIbo;

unsigned int ProjectionMatrixLocation, ViewMatrixLocation, ModelMatrixLocation;

mat4 ModelMatrix;
mat4 ProjectionMatrix;
mat4 ViewMatrix;

void RenderBackground()
{   //glLoadIdentity();
glUseProgram(ProgramShader);
//backgroundShader.Use();
/*glUniformMatrix4fv(ProjectionMatrixLocation,  1, false, ProjectionMatrix.m);
glUniformMatrix4fv(ViewMatrixLocation,  1, false, ViewMatrix.m);
mat4 identity;
identity.setIdentity();
glUniformMatrix4fv(ModelMatrixLocation, 1, false, identity.m);

glUniformMatrix4fv(ModelMatrixLocation, 1, false, ModelMatrix.m);
glBindVertexArray(BackgroundVao);                                       //revine la starea de desenare a cubului
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)0); //deseneaza backgroundul, 4 indecsi
*/
glBegin(GL_POLYGON);
glColor3f(0.8f,0.8f,1.0f);
glVertex3f(-200.0f,-100.0f,-100.0f);
glVertex3f(200.0f,-100.0f,-100.0f);
glColor3f(0.4f,0.4f,0.8f);  
glVertex3f(200.0f,100.0f,-100.0f);
glVertex3f(-200.0f,100.0f,-100.0f);
glEnd();
glUseProgram(0);    
}

glBegin仅用于测试并且有效,但是当我尝试使用glDrawElements时,我会看到黑屏。

void display(void) {
switch(current_mode) {
    case CPU:
        RenderCPU();
    break;

    case GPU:
        RenderBackground();
    break;

    case CUDA:
        RenderCUDA();
    break;
}   
glutSwapBuffers();
glutPostRedisplay();
}

我的主要是:

int main ( int argc, char** argv ) 
{
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE | GLUT_DEBUG);
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA | GLUT_MULTISAMPLE);
glutInitWindowSize(1280, 720 ); 
glutCreateWindow( "Etapa 2 - Cloth" );

glutDisplayFunc(display);  
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);

glewExperimental =true;
glewInit();
glGetError();

glEnable(GL_MULTISAMPLE);
glEnable(GL_DEPTH_TEST);


InitShaders(std::string("shaders\\background.vs"),std::string("shaders\\background.fs"));
glBuffersInit();
ModelMatrix.setIdentity();
glutMainLoop();
}

我的着色器装载程序:

void InitShaders(std::string VertexShaderFilename, std::string FragmentShaderFilename){
int InfoLogLength=0,Result=0;

//constructie vertex shader
std::cout<<std::endl<<"Constructie vertex shader din "<<VertexShaderFilename<<std::endl;
VertexShader = glCreateShader(GL_VERTEX_SHADER);                            //creez un obiect de tip vertex shader 
std::string VertexShaderCode = LoadText(VertexShaderFilename);              //citesc fiserul si il tin in string
const char *VertexShaderCodePtr = VertexShaderCode.c_str();
const int VertexShaderCodeSize = VertexShaderCode.size();
glShaderSource(VertexShader,1,&VertexShaderCodePtr,&VertexShaderCodeSize);  //atasez codul sursa din string in obiectul de tip vertex shader
glCompileShader(VertexShader);                                              //compilez obiectul
glGetShaderiv(VertexShader, GL_COMPILE_STATUS, &Result);                    //obtin rezultatul compilarii
if(Result == GL_FALSE){
    glGetShaderiv(VertexShader, GL_INFO_LOG_LENGTH, &InfoLogLength);        //obtin lungimea logului
    std::vector<char> VertexShaderLog(InfoLogLength);
    glGetShaderInfoLog(VertexShader, InfoLogLength, NULL, &VertexShaderLog[0]); //copiez logul
    std::cout<<"EROARE :\n "<<&VertexShaderLog[0]<<std::endl;                   //output log
}else std::cout<<"Constructie vertex shader terminata cu sucess"<<std::endl<<std::endl;

CHECK_GL_ERRORS

//constructie fragment shader
std::cout<<"Constructie fragment shader din "<<FragmentShaderFilename<<std::endl;
FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);                        //creez un obiect de tip fragment shader 
std::string FragmentShaderCode = LoadText(FragmentShaderFilename);          //citesc fiserul si il tin in string
const char *FragmentShaderCodePtr = FragmentShaderCode.c_str();
const int FragmentShaderCodeSize = FragmentShaderCode.size();
glShaderSource(FragmentShader,1,&FragmentShaderCodePtr,&FragmentShaderCodeSize);//atasez codul sursa din string in obiectul de tip fragment shader
glCompileShader(FragmentShader);                                            //compilez obiectul
glGetShaderiv(FragmentShader, GL_COMPILE_STATUS, &Result);                  //obtin rezultatul compilarii
if(Result == GL_FALSE){
    glGetShaderiv(FragmentShader, GL_INFO_LOG_LENGTH, &InfoLogLength);      //obtin lungimea logului
    std::vector<char> FragmentShaderLog(InfoLogLength);
    glGetShaderInfoLog(FragmentShader, InfoLogLength, NULL, &FragmentShaderLog[0]); //copiez logul
    std::cout<<"EROARE :\n "<<&FragmentShaderLog[0]<<std::endl;             //output log
}else std::cout<<"Constructie fragment shader terminata cu success "<<std::endl<<std::endl;

CHECK_GL_ERRORS

//constructie program combinat
std::cout<<"Constructie program combinat "<<std::endl;
ProgramShader = glCreateProgram();                                          //creez un obiect gol de tip program
glAttachShader(ProgramShader,VertexShader);                                 //atasez obiectul de tip vertex shader
glAttachShader(ProgramShader,FragmentShader);                               //atasez obiectul de tip fragment shader
glLinkProgram(ProgramShader);                                               //link-ez programul
glGetProgramiv(ProgramShader, GL_LINK_STATUS, &Result);                     //obtin rezultatul linkarii
if(Result == GL_FALSE){                                                     
    glGetProgramiv(ProgramShader, GL_INFO_LOG_LENGTH, &InfoLogLength);      
    std::vector<char> ProgramShaderLog(InfoLogLength);
    glGetProgramInfoLog(ProgramShader, InfoLogLength, NULL, &ProgramShaderLog[0]);
    std::cout<<"EROARE :\n "<<&ProgramShaderLog[0]<<std::endl;
}else std::cout<<"Constructie program terminata cu success "<<std::endl;
glDeleteShader(VertexShader);                                               //nu mai sunt necesare daca vom lucra doar cu programul
glDeleteShader(FragmentShader);

CHECK_GL_ERRORS

//obtine locatiile uniform-urilor din programul compilat & linkat
ProjectionMatrixLocation = glGetUniformLocation(ProgramShader, "projMatrix");
ViewMatrixLocation = glGetUniformLocation(ProgramShader, "viewMatrix");
ModelMatrixLocation = glGetUniformLocation(ProgramShader, "modelMatrix");

CHECK_GL_ERRORS
}

0 个答案:

没有答案