Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在openGL中打印红色三角形_C++_Opengl - Fatal编程技术网

C++ 在openGL中打印红色三角形

C++ 在openGL中打印红色三角形,c++,opengl,C++,Opengl,我有以下代码,正在尝试使用opengl glew ect打印一个红色三角形。该程序构建并显示一个三角形,但是当我拖动窗口时,它只显示一个三角形,三角形显示为白色而不是红色。不确定如何解决此问题。下面是我的代码副本(我在xcode中运行) #包括 //格洛 #定义GLEW_静态 #包括 //GLFW #包括 静态无符号整数编译器标头(无符号整数类型,常量std::string和source) { unsigned int id=glCreateShader(类型); const char*src=

我有以下代码,正在尝试使用opengl glew ect打印一个红色三角形。该程序构建并显示一个三角形,但是当我拖动窗口时,它只显示一个三角形,三角形显示为白色而不是红色。不确定如何解决此问题。下面是我的代码副本(我在xcode中运行)

#包括
//格洛
#定义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";