C++ OpenGL红皮书加载着色器赢得';不加载着色器

C++ OpenGL红皮书加载着色器赢得';不加载着色器,c++,opengl,C++,Opengl,加载基本片段和顶点着色器时遇到问题。我试着运行OpenGL红皮书中OpenGL 4.3的示例代码,除了三角形不是蓝色外,它工作得很好 我的loadShaders.h和loadShaders.cpp与main.cpp目录位于同一目录中 我像这样链接文件:g++main.cpp LoadShaders.cpp-lGL-lGLEW-lGLU-lglut-o run my:main.cpp文件、triangles.vert文件和triangles.frag文件看起来与本书中的示例代码完全相同 有人帮我解

加载基本片段和顶点着色器时遇到问题。我试着运行OpenGL红皮书中OpenGL 4.3的示例代码,除了三角形不是蓝色外,它工作得很好

我的loadShaders.h和loadShaders.cpp与main.cpp目录位于同一目录中

我像这样链接文件:
g++main.cpp LoadShaders.cpp-lGL-lGLEW-lGLU-lglut-o run

my:main.cpp文件、triangles.vert文件和triangles.frag文件看起来与本书中的示例代码完全相同

有人帮我解决这个问题

main.cpp:

#include<GL/glew.h>
#include<GL/freeglut.h>
#include<GL/gl.h>
#include<iostream>

#include"LoadShaders.h"
#include"vgl.h"
using namespace std;

enum VAO_IDs {Triangles, NumVAOs };
enum Buffer_IDs {ArrayBuffer, NumBuffers };
enum Attrib_IDs {vPosition = 0};

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;

void init(void)
{
    glGenVertexArrays(NumVAOs, VAOs);
    glBindVertexArray(VAOs[Triangles]);

    GLfloat vertices[NumVertices] [2] = {
        {-0.90, -0.90},
        {0.85, -0.90 },
        {-0.90, 0.85 },
        {0.90, -0.85 },
        {0.90, 0.90  },
        {-0.85, 0.90 }
    };

    glGenBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    ShaderInfo shaders[]={
        {GL_VERTEX_SHADER, "triangles.vert"},
        {GL_FRAGMENT_SHADER, "triangles.frag"},
        {GL_NONE}
    };

    GLuint program = LoadShaders(shaders);
    glUseProgram(program);

    glVertexAttribPointer(vPosition, 2, GL_FLOAT,
                GL_FALSE, 0, 0);
    glEnableVertexAttribArray(vPosition);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    glFlush();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512,512);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);

    if (glewInit()) {
        cerr << "Unable to initialize GLEW"<<endl;
        exit(EXIT_FAILURE);
    }

    init();

    glutDisplayFunc(display);

    glutMainLoop();
}
三角形.frag:

#version 430 core

out vec4 fColor;

void main()
{
    fColor = vec4(0.0, 0.0, 1.0, 1.0);
}
  • GLSL区分大小写:
    gl_位置
    !=<代码>总帐位置
  • 请求满足或超过着色器所需GLSL版本的上下文版本(通过
    glutInitContextVersion()
  • glewInit()之前将
    gleweexperimental
    设置为
    GL\u TRUE
这适用于我的(OpenGL 4.2)系统:

#包括
#包括
#包括
结构程序
{
静态粘合负载(常量字符*垂直,常量字符*几何,常量字符*框架)
{
GLuint prog=glCreateProgram();
if(vert)附加着色器(prog,GL_VERTEX_着色器,vert);
if(geom)AttachShader(prog,GL_GEOMETRY_SHADER,geom);
if(frag)附加着色器(prog,GL_FRAGMENT_着色器,frag);
GLLINK计划(prog);
检查状态(prog);
返回程序;
}
私人:
静态无效检查状态(GLuint obj)
{
闪烁状态=GLU FALSE;
if(glishader(obj))glGetShaderiv(obj、GL\u编译状态和状态);
if(glIsProgram(obj))glGetProgramiv(obj、GL链接状态和状态);
if(status==GL_TRUE)返回;

GLchar log[1清除main对glutInitContextProfile的调用。这和glutInitContextVersion(()给我带来了麻烦,我想我可以通过接受默认配置文件来摆脱它们。然后将此添加到片段着色器的顶部:

#version 300 es
precision mediump float;
…并且顶点着色器需要将其版本与顶部的匹配:

#version 300 es
另外,要注意着色器路径。我必须用

ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "../../triangles.vert" },
{ GL_FRAGMENT_SHADER, "../../triangles.frag" },
{ GL_NONE, NULL }
};

你真的需要提供更多的信息,最好是你的代码,但是如果三角形不是应该的蓝色,那么很可能是你的片段着色器有问题。它在上面,但是我试图不让问题太大。现在当我运行程序时,我得到一个错误,说:无法创建OpenGL 4.3上下文(标志0,概要文件1)?当然这本书应该说些什么?你的OpenGL实现支持4.3吗?对不起,我不知道你的意思。我在一个小版本测试仪中编辑,运行它,看看哪个版本会弹出。嗯……好吧,这很奇怪。我删掉了glutInitContextVersion(4,3)并添加到您的版本测试仪中,着色器突然工作!版本测试仪弹出:4.2.12337 Compatibility Profile Context 13.101这意味着什么?
#version 300 es
precision mediump float;
#version 300 es
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "../../triangles.vert" },
{ GL_FRAGMENT_SHADER, "../../triangles.frag" },
{ GL_NONE, NULL }
};