C++ 在openGL中打印红色三角形
我有以下代码,正在尝试使用opengl glew ect打印一个红色三角形。该程序构建并显示一个三角形,但是当我拖动窗口时,它只显示一个三角形,三角形显示为白色而不是红色。不确定如何解决此问题。下面是我的代码副本(我在xcode中运行)C++ 在openGL中打印红色三角形,c++,opengl,C++,Opengl,我有以下代码,正在尝试使用opengl glew ect打印一个红色三角形。该程序构建并显示一个三角形,但是当我拖动窗口时,它只显示一个三角形,三角形显示为白色而不是红色。不确定如何解决此问题。下面是我的代码副本(我在xcode中运行) #包括 //格洛 #定义GLEW_静态 #包括 //GLFW #包括 静态无符号整数编译器标头(无符号整数类型,常量std::string和source) { unsigned int id=glCreateShader(类型); const char*src=
#包括
//格洛
#定义GLEW_静态
#包括
//GLFW
#包括
静态无符号整数编译器标头(无符号整数类型,常量std::string和source)
{
unsigned int id=glCreateShader(类型);
const char*src=source.c_str();
glShaderSource(id,1,&src,nullptr);
glCompileShader(id);
int结果;
glGetShaderiv(id、GL\u编译状态和结果);
如果(结果!=GL\U FALSE)
{
整数长度;
glGetShaderiv(标识、总账信息、日志长度和长度);
char*message=(char*)alloca(长度*sizeof(char));
glGetShaderInfoLog(id、长度和长度、消息);
std::cout如果您想要任何超过GL 2.1的内容,您需要在macOS上全力以赴地研究核心上下文:
- 通过
GLFW_OPENGL_PROFILE
、GLFW_context_VERSION_MAJOR
和GLFW_context_VERSION_MINOR
请求版本化的核心上下文;它应该满足或超过您在着色器中指定的#版本
- 特别是对于macOS,您可以将
GLFW\u OPENGL\u FORWARD\u COMPAT
设置为GL\u TRUE
- 核心上下文需要一个框架来绘制任何内容;对于简单的内容,您可以创建一个单独的框架并将其绑定
总而言之:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <vector>
#include <iostream>
#include <cstdarg>
struct Program
{
static GLuint Load( const char* shader, ... )
{
GLuint prog = glCreateProgram();
va_list args;
va_start( args, shader );
while( shader )
{
const GLenum type = va_arg( args, GLenum );
AttachShader( prog, type, shader );
shader = va_arg( args, const char* );
}
va_end( args );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
private:
static 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;
GLchar 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;
std::exit( EXIT_FAILURE );
}
static 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 );
}
};
const char* vert = 1 + R"GLSL(
#version 330 core
layout(location = 0) in vec4 position;
void main()
{
gl_Position = position;
};
)GLSL";
const char* frag = 1 + R"GLSL(
#version 330 core
layout(location = 0) out vec4 color;
void main()
{
color = vec4(1.0, 0.0, 0.0, 1.0);
}
)GLSL";
int main(void)
{
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 );
glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 );
glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE );
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK)
std::cout << "Error!" << std::endl;
GLuint vao = 0;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
float positions[6] =
{
-0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
unsigned int buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0);
GLuint shader = Program::Load( vert, GL_VERTEX_SHADER, frag, GL_FRAGMENT_SHADER, NULL );
glUseProgram(shader);
glBindBuffer(GL_ARRAY_BUFFER, 0);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glDeleteProgram(shader);
glfwTerminate();
return 0;
}
#包括
#包括
#包括
#包括
#包括
结构程序
{
静态GLuint加载(常量字符*着色器,…)
{
GLuint prog=glCreateProgram();
va_列表参数;
va_开始(参数、着色器);
while(着色器)
{
恒盂类型=va_arg(args,盂);
附加着色器(程序、类型、着色器);
着色器=va_arg(args,const char*);
}
va_端(args);
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您的问题可能在顶点着色器中,因为在顶点着色器中,vec4位置中的“布局(位置=0);\n”
在这里您定义了vec4,但在中,您是从glVertexAttribPointer()函数发送vec2。
尝试发送vec4或在顶点着色器中尝试此操作
std::string vertexShader =
"#version 330 core\n"
"\n"
"layout(location = 0) in vec2 position;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = vec4(position, 0, 1);\n"
"}\n";
你确定你的着色器正在编译吗?这两个着色器都不适合我。在你的CompileShader函数中将if(result!=GL\u FALSE)
更改为if(result==GL\u FALSE)
。仍然具有相同的issue@Iza当您更改为if(result==GL\u FALSE)时,该程序对我来说运行良好
。您是否在if(glewInit()!=GLEW\u OK)
之前尝试过glewExperimental=GL\u TRUE;
?OpenGL将自动用y=0、z=0、w=1填充未指定的向量组件,请参阅中的10.3.5“传输数组元素”。
std::string vertexShader =
"#version 330 core\n"
"\n"
"layout(location = 0) in vec2 position;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = vec4(position, 0, 1);\n"
"}\n";