C++ OpenGL红皮书加载着色器赢得';不加载着色器
加载基本片段和顶点着色器时遇到问题。我试着运行OpenGL红皮书中OpenGL 4.3的示例代码,除了三角形不是蓝色外,它工作得很好 我的loadShaders.h和loadShaders.cpp与main.cpp目录位于同一目录中 我像这样链接文件: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文件看起来与本书中的示例代码完全相同 有人帮我解
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
#包括
#包括
#包括
结构程序
{
静态粘合负载(常量字符*垂直,常量字符*几何,常量字符*框架)
{
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 }
};