【问题标题】:First example in OpenGL 4.0 Shading Language CookbookOpenGL 4.0 Shading Language Cookbook 中的第一个示例
【发布时间】:2015-07-14 07:45:19
【问题描述】:

我昨天开始学习GLSL,按照OpenGL 4.0 Shading Language Cookbook的第一个例子一步一步画了一个三角形。

这是我的代码:

1.shader.vert

#version 400

in vec3 VertexPosition;
in vec3 VertexColor;

out vec3 Color;

void main()
{
    Color = VertexColor;
    gl_Position = vec4(VertexPosition, 1.0);
}

2.shader.frag

#version 400

in vec3 Color;
out vec4 FragColor;

void main(){
    FragColor = vec4(Color, 1.0);
}

3.main.cpp

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Project1");

    glutDisplayFunc(render);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 100, 0, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_POINT_SMOOTH);

    // init glew
    GLenum err = glewInit();
    if (GLEW_OK != err){
        printf("Error: %s\n", glewGetErrorString(err));
    }
    else{
        printf("OK: glew init.\n");
    }

    // check gl version
    const GLubyte *renderer = glGetString(GL_RENDERER);
    const GLubyte *vendor = glGetString(GL_VENDOR);
    const GLubyte *version = glGetString(GL_VERSION);
    const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
    GLint major, minor;
    glGetIntegerv(GL_MAJOR_VERSION, &major);
    glGetIntegerv(GL_MINOR_VERSION, &minor);
    printf("GL Vendor   : %s\n", vendor);
    printf("GL Renderer : %s\n", renderer);
    printf("GL Version (string) : %s\n", version);
    printf("GL Version (integer): %d.%d\n", major, minor);
    printf("GLSL Version: %s\n", glslVersion);

    // vertex shader
    GLuint vertShader = createAndCompileShader("shader.vert", VERTEX);

    // fragment shader
    GLuint fragShader = createAndCompileShader("shader.frag", FRAGMENT);

    // program
    GLuint programHandle = glCreateProgram();
    if (programHandle == 0)
    {
        printf("Error creating program object.\n");
    }

    glAttachShader(programHandle, vertShader);
    glAttachShader(programHandle, fragShader);

    glLinkProgram(programHandle);

    GLint status;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &status);
    if (GL_FALSE == status){
        printf("Failed to link shader program");
    }
    else{
        printf("OK\n");
        glUseProgram(programHandle);
    }

    glutMainLoop();


    return EXIT_SUCCESS;
}

我在createAndCompileShader创建并编译shader,编译状态为成功。

我在render 函数中画了一个三角形。

void render()
{
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();

    glBegin(GL_TRIANGLES);

    glColor3f(1.0, 0.0, 0.0);
    glVertex2f(20, 20);
    glColor3f(0.0, 1.0, 0.0);
    glVertex2f(80, 20);
    glColor3f(0.0, 0.0, 1.0);
    glVertex2f(50, 80);

    glEnd();

    glPopMatrix();

    glutSwapBuffers();
}

链接状态也是成功。但是,窗口中没有绘制任何内容。我确定render这个函数是对的。

有什么问题吗?

【问题讨论】:

  • 嗨,Spektre。当 GLSL 着色器未绑定时,三角形可见。我用的是英伟达。顶点着色器和书中的一样。
  • 尝试我提供的新坐标,关闭 CULL_FACE 并绑定 GLSL
  • 您不能将自定义着色器属性与固定函数绘制代码一起使用。您要么必须修改着色器以适合您的绘图,要么使用 glDraw* 命令进行绘图。
  • 或在您的顶点着色器中使用gl_Position = ftransform(); 来合并变换矩阵...(抱歉,我在核心配置文件中编码,所以一开始并没有发现您错过了那行)
  • @BDL 或使用兼容性配置文件...或对于 nVidia 使用默认布局位置,但这很脏 Attribute locations

标签: c++ opengl glsl


【解决方案1】:

如果您不绑定任何 GLSL 着色器,您的三角形是否可见?

  • 试试glDisable(GL_CULL_FACE);
  • 如果它有助于重新排序 glVertex2f 调用(不同的多边形缠绕)

你有什么显卡和驱动程序?

  • 对于 OpenGL+GLSL+Windows
  • Intel 几乎无法使用(尤其是高级产品)
  • ATI/AMD 这些天通常几乎没问题(旧的 ATI 驱动程序最糟糕)
  • nVidia 通常没有任何问题

您没有在顶点着色器中应用任何投影或模型视图矩阵

  • 你的模型视图是身份,所以没关系
  • 但投影不是
  • 这意味着您将未转换的坐标传递给片段着色器
  • OpenGL 坐标通常在<-1,+1> 范围内
  • 并且您的未转换三角形不涵盖该范围
  • 例如,将三角形坐标更改为该范围
  • (-0.5,-0.5),(+0.5,-0.5),(0.0,+0.5)
  • 并尝试渲染(您也可以暂时将//gluOrtho2D(0, 100, 0, 100); 重新命名,以确保
  • 如果有帮助,那就是原因
  • 更改您的顶点着色器以包括:gl_Position = ftransform();
  • 如果核心配置文件不再是一个选项
  • 因此您应该通过统一变量传递变换矩阵
  • 通常在顶点着色器中进行乘法
  • simple GLSL engine example
  • 它有纹理、法线贴图、3 灯、...
  • Understanding homogenous 4x4 transform matrices

[edit1] 你使用的是glVertex 而不是VAO,所以你应该使用compatibility 配置文件

// vertex shader
#version 400 compatibility

out vec3 Color;

void main()
    {
    Color = gl_Color.rgb;
    gl_Position = ftransform();
    }
  • 应该可以解决问题...

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多