将OpenGL SuperBible(6E)示例中的代码应用到GLFW窗口时出现的问题
我目前正试图通过OpenGL超级圣经(6E)学习OpenGL。但是,我没有使用作者编写的windowing类,而是尝试将示例应用到我自己的GLFW windowing环境中 到目前为止,我已经能够自己重新创建许多示例,但我遇到了一个无法使用的示例 下面是问题SuperBible示例“movingtri”的.cpp文件: 然后三角形出现,但当然不会移动 下面是movingtri.cpp示例的gif图像: 下面是我在实现movingtri.cpp时失败的尝试的图像:将OpenGL SuperBible(6E)示例中的代码应用到GLFW窗口时出现的问题,opengl,glfw,Opengl,Glfw,我目前正试图通过OpenGL超级圣经(6E)学习OpenGL。但是,我没有使用作者编写的windowing类,而是尝试将示例应用到我自己的GLFW windowing环境中 到目前为止,我已经能够自己重新创建许多示例,但我遇到了一个无法使用的示例 下面是问题SuperBible示例“movingtri”的.cpp文件: 然后三角形出现,但当然不会移动 下面是movingtri.cpp示例的gif图像: 下面是我在实现movingtri.cpp时失败的尝试的图像: 您需要从GLFW请求核心上下文
您需要从GLFW请求核心上下文。检查着色器编译和链接状态/日志也是一个好主意 试着这样做:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
char log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( -1 );
}
void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
GLuint LoadProgram( const char* vert, const char* geom, const char* frag )
{
GLuint prog = glCreateProgram();
if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
if( geom ) AttachShader( prog, GL_GEOMETRY_SHADER, geom );
if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
#define GLSL(version, shader) "#version " #version "\n" #shader
int main( int argc, char** argv )
{
if( !glfwInit() )
{
exit(EXIT_FAILURE);
}
glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 1 );
glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL - movingtri", NULL, NULL);
if( !window )
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
GLenum err = glewInit();
if( GLEW_OK != err )
{
cerr << "glewInit() failed: " << glewGetErrorString(err) << endl;
glfwTerminate();
exit(EXIT_FAILURE);
}
const char* vert = GLSL
(
410 core,
layout (location = 0) in vec4 offset;
void main()
{
const vec4 vertices[] = vec4[]
(
vec4( 0.25, -0.25, 0.5, 1.0),
vec4(-0.25, -0.25, 0.5, 1.0),
vec4( 0.25, 0.25, 0.5, 1.0)
);
// Add 'offset' to our hard-coded vertex position
gl_Position = vertices[ gl_VertexID ] + offset;
}
);
const char* frag = GLSL
(
410 core,
out vec4 color;
void main()
{
color = vec4(0.0, 0.8, 1.0, 1.0);
}
);
GLuint program = LoadProgram( vert, NULL, frag );
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
while( !glfwWindowShouldClose(window) )
{
double currentTime = glfwGetTime();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
// begin rendering code from movingtri
static const GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, green);
glUseProgram(program);
GLfloat attrib[] =
{
(float)sin(currentTime) * 0.5f,
(float)cos(currentTime) * 0.6f,
0.0f,
0.0f
};
glVertexAttrib4fv(0, attrib);
glDrawArrays(GL_TRIANGLES, 0, 3);
//end rendering code
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效检查状态(GLuint obj)
{
闪烁状态=GLU FALSE;
if(glishader(obj))glGetShaderiv(obj、GL\u编译状态和状态);
if(glIsProgram(obj))glGetProgramiv(obj、GL链接状态和状态);
if(status==GL_TRUE)返回;
char log[1这里有同样的问题,但我让它工作了
顶点着色器:
layout (location = 1) in vec4 offset;
节目:
glVertexAttrib4fv(1, attrib);
所以我所做的就是将位置改为1而不是0。其他大于0的数字也可以。
我不知道为什么location=0对于顶点位置以外的任何数据都是禁止的
有人有想法吗?哇,谢谢你的代码。它工作得非常好。奇怪的是,我已经尝试添加了3行glfwWindowHint,还测试了着色器编译结果。所以我不确定这里到底发生了什么,但我将彻底研究你的示例。再次感谢。@okxef:没问题。我很高兴它能为你工作r您,因为我似乎无法让它在我的系统上旋转:)
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
char log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( -1 );
}
void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
GLuint LoadProgram( const char* vert, const char* geom, const char* frag )
{
GLuint prog = glCreateProgram();
if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
if( geom ) AttachShader( prog, GL_GEOMETRY_SHADER, geom );
if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
#define GLSL(version, shader) "#version " #version "\n" #shader
int main( int argc, char** argv )
{
if( !glfwInit() )
{
exit(EXIT_FAILURE);
}
glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 1 );
glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL - movingtri", NULL, NULL);
if( !window )
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
GLenum err = glewInit();
if( GLEW_OK != err )
{
cerr << "glewInit() failed: " << glewGetErrorString(err) << endl;
glfwTerminate();
exit(EXIT_FAILURE);
}
const char* vert = GLSL
(
410 core,
layout (location = 0) in vec4 offset;
void main()
{
const vec4 vertices[] = vec4[]
(
vec4( 0.25, -0.25, 0.5, 1.0),
vec4(-0.25, -0.25, 0.5, 1.0),
vec4( 0.25, 0.25, 0.5, 1.0)
);
// Add 'offset' to our hard-coded vertex position
gl_Position = vertices[ gl_VertexID ] + offset;
}
);
const char* frag = GLSL
(
410 core,
out vec4 color;
void main()
{
color = vec4(0.0, 0.8, 1.0, 1.0);
}
);
GLuint program = LoadProgram( vert, NULL, frag );
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
while( !glfwWindowShouldClose(window) )
{
double currentTime = glfwGetTime();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
// begin rendering code from movingtri
static const GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, green);
glUseProgram(program);
GLfloat attrib[] =
{
(float)sin(currentTime) * 0.5f,
(float)cos(currentTime) * 0.6f,
0.0f,
0.0f
};
glVertexAttrib4fv(0, attrib);
glDrawArrays(GL_TRIANGLES, 0, 3);
//end rendering code
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
layout (location = 1) in vec4 offset;
glVertexAttrib4fv(1, attrib);