GLFW三角形不会变色

2024-01-09

我一直在关注有关如何使用 glfw 制作基本图形的 YouTube 简短教程。我无法让我的三角形改变颜色帮助我。

主要代码:

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <fstream>

#include <GL/glew.h>
#include <GLFW/glfw3.h>

std::string LoadFileToString(const char* filepath)
{
    std::string fileData;
    std::ifstream stream(filepath, std::ios::in);

    if (stream.is_open())
    {
        std::string line = "";

        while (getline(stream, line))
        {
            fileData += "\n" + line;
        }

        stream.close();
    }

    return fileData;
}

GLuint LoadShaders(const char* vertShaderPath, const char* fragShaderPath)
{
    GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);

    std::string vertShaderSource = LoadFileToString(vertShaderPath);
    std::string fragShaderSource = LoadFileToString(vertShaderPath);

    const char* rawVertShaderSource = vertShaderSource.c_str();
    const char* rawFragShaderSource = fragShaderSource.c_str();
    
    glShaderSource(vertShader, 1, &rawVertShaderSource, NULL);
    glShaderSource(fragShader, 1, &rawFragShaderSource, NULL);

    glCompileShader(vertShader);
    glCompileShader(fragShader);

    GLuint program = glCreateProgram();
    glAttachShader(program, vertShader);
    glAttachShader(program, fragShader);
    glLinkProgram(program);

    return program;
}

int main()
{
    if (glfwInit() == false)
    {
        //did not succeed
        fprintf(stderr, "GLFW failed to initialise.");
        return -1;
    }

    //4 AA
    glfwWindowHint(GLFW_SAMPLES, 4);
    //tells glfw to set opengl to 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window;
    window = glfwCreateWindow(640, 480, "DJ KELLER KEEMSTAR", NULL, NULL);

    if (!window)
    {
        fprintf(stderr, "Window failed to create");
        glfwTerminate();
        return -1;
    }
    
    glfwMakeContextCurrent(window);
    glewExperimental = true;
    
    if (glewInit() != GLEW_OK)
    {
        fprintf(stderr, "Glew failed to initialise");
        glfwTerminate();
        return -1;
    }

    //generate VAO
    GLuint vaoID;
    glGenVertexArrays(1, &vaoID);
    glBindVertexArray(vaoID);

    static const GLfloat verts[] =
    {
        //X, Y, Z
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f, 1.0f, 0.0f
    };

    GLuint program = LoadShaders("shader.vertshader", "shader.fragshader");

    //generate VBO
    GLuint vboID;
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);

    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    do
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glEnableVertexAttribArray(0);
        
        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

        glUseProgram(program);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        
        glDisableVertexAttribArray(0);

        glfwSwapBuffers(window);
        glfwPollEvents();
    
    } while (glfwWindowShouldClose(window) == false);

    return 0;
}

碎片着色器:

#version 330 core
out vec3 color;

void main()
{
    color = vec3(1,0,0);
}

垂直着色器:

#version 330 core
layout(location = 0) in vec3 in_pos;

void main()
{
    gl_Position.xyz = in_pos;
    gl_Position.w = 1;
}

三角形应该是红色的:


std::string vertShaderSource = LoadFileToString(vertShaderPath);
std::string fragShaderSource = LoadFileToString(vertShaderPath);
                                                ^^^^^^^^^^^^^^ wat

不要尝试将顶点着色器用作片段着色器。

建议在组装着色器时查询编译和链接状态/日志:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#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;
        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 );
    }
};

#define GLSL(version, shader) "#version " #version "\n" #shader

const char* vert = GLSL
(
    330 core,
    layout( location = 0 ) in vec3 in_pos;
    void main()
    {
        gl_Position.xyz = in_pos;
        gl_Position.w = 1;
    }
);

const char* frag = GLSL
(
    330 core,
    out vec3 color;
    void main()
    {
        color = vec3(1,0,0);
    }
);

int main()
{
    if (glfwInit() == false)
    {
        //did not succeed
        fprintf(stderr, "GLFW failed to initialise.");
        return -1;
    }

    //4 AA
    glfwWindowHint(GLFW_SAMPLES, 4);
    //tells glfw to set opengl to 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window = glfwCreateWindow(640, 480, "DJ KELLER KEEMSTAR", NULL, NULL);
    if (!window)
    {
        fprintf(stderr, "Window failed to create");
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
    {
        fprintf(stderr, "Glew failed to initialise");
        glfwTerminate();
        return -1;
    }

    //generate VAO
    GLuint vaoID;
    glGenVertexArrays(1, &vaoID);
    glBindVertexArray(vaoID);

    static const GLfloat verts[] =
    {
        //X, Y, Z
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f, 1.0f, 0.0f
    };

    GLuint program = Program::Load
        (
        vert, GL_VERTEX_SHADER,
        frag, GL_FRAGMENT_SHADER,
        NULL
        );

    //generate VBO
    GLuint vboID;
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);

    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    do
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glEnableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

        glUseProgram(program);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glDisableVertexAttribArray(0);

        glfwSwapBuffers(window);
        glfwPollEvents();

    } while (glfwWindowShouldClose(window) == false);

    return 0;
}

这样,如果你尝试这样的事情:

GLuint program = Program::Load
    (
    vert, GL_VERTEX_SHADER,
    vert, GL_VERTEX_SHADER,
    NULL
    );

...它会提前退出并让您更好地了解出了什么问题:

Vertex shader(s) failed to link.
Vertex link error: INVALID_OPERATION.
ERROR: 0:2: error(#248) Function already has a body: main
ERROR: error(#273) 1 compilation errors.  No code generated
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLFW三角形不会变色 的相关文章

随机推荐

  • 如何让selenium等待ajax响应?

    我怎样才能让硒等待日历小部件之类的东西加载 现在我只是在做一个Thread sleep 2500 将测试用例导出到 junit 程序后 我会用 waitForElementPresent locator 这将等到该元素出现在 DOM 中 如
  • iOS 8 横向模式下按钮不显示

    我有一个按钮 我将其约束设置为 水平中心 和 垂直中心 在纵向模式下 它按预期出现在中心 但是当我将设备旋转到横向模式时 按钮消失 状态栏也不可见 Here is a screen which show constraint needed
  • 将数量输入字段更改为 WooCommerce 中的下拉菜单

    我在 function php 中使用以下内容 它在单个产品页面上效果很好 我遇到的问题是在购物车页面上 当您选择不同的数量时 它不会自动更新购物车 有任何想法吗 function woocommerce quantity input ar
  • PHP - 序列化具有静态属性的类

    当用户登录我的网站时 我会创建一个实例User类 获取一些与用户相关的数据并将对象存储在SESSION 我从数据库获取的一些数据应该在整个会话期间保持不变 并且我希望可以从其他对象访问这些数据 我更喜欢使用User static value
  • 如何在AppDomain中执行非托管程序集?

    执行非托管程序集时出现以下错误 无法加载文件或程序集 文件 C 程序 文件 Maxima 5 21 1 lib maxima 5 21 1 binary gcl maxima exe 或其依赖项之一 这 模块预计包含一个 装配清单 我应该怎
  • Tailwind CSS + VueJS 单文件组件与 VS Code 集成

    如何正确配置 Tailwind CSS 和 VS Code 以至少禁用 VueJS 单文件组件 vue cli 内有关 at rule 和空标记错误的错误
  • 用 C++ 编写操作系统[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python/Pandas:如何从 datetime64[ns] 转换为 datetime

    我有一个处理 Excel 文件的脚本 发送它的部门有一个生成它的系统 我的脚本停止工作 我突然收到错误Can only use str accessor with string values which use np object dtyp
  • atexit() 函数

    有几个教程解释了如何使用atexit 函数如 http linux die net man 3 atexit http linux die net man 3 atexit 示例在 main 函数中给出 很容易理解 但是 我正在我的程序中创
  • 在 Windows 中使用 .Net 手动加载和卸载驱动程序

    我有一个通过 COM USB 转换器使用 USB 端口连接到计算机的设备 并且我使用 FTDI 驱动程序来模拟该 USB 上的虚拟 COM 端口 我的转换器有时会冻结 Windows 驱动程序也是如此 我无法打开 关闭 COM 软件无法通过
  • 获取单选按钮值 [INNO SETUP]

    我正在尝试在 Inno Setup 中创建一个新窗口 在此窗口中 应该有 5 个单选按钮 用户必须仅选择此选项之一 当用户单击下一个按钮时 我必须获取并保存单选按钮的值 在某处 并将该值传递给带有参数的批处理文件 将运行 我认为我应该在 N
  • ASP.NET 中的 Excel 读取:如果列具有不同的数据格式,则不会读取数据

    我有一个 asp net C 应用程序 我正在其中使用 OLEDBConnection 读取电子表格的内容 我正在使用下面的代码行从 Excel 电子表格中读取数据 OleDbConnection con new OleDbConnecti
  • 在负载平衡情况下使用 WCF 4.5 RemoteEndpointMessageProperty 获取客户端 IP 地址

    我在 IIS 中托管了 WCF 4 5 Restful 服务 我正在尝试使用 RemoteEndpointMessageProperty 获取客户端的 IP 地址 消耗该服务 Code 1 private string GetClientI
  • 为什么人们不使用四面体作为天空盒?

    在3D游戏中渲染固定纹理的天空时 人们通常会先在立方体贴图中创建6个纹理 然后在相机周围渲染一个立方体 在 GLSL 中 您可以使用法线而不是纹理坐标来访问纹理中的像素 并且可以通过标准化相对于相机的片段位置轻松获得该法线 然而 这个过程可
  • 将多字节字符映射到其 unicode 点表示

    如何在 C 中将单个 UTF 8 字符映射到其 unicode 点 例如 将被映射到00c8 如果您的平台wchar t存储unicode 如果它是32位类型 它可能会 并且你有一个UTF 8语言环境 你可以调用mbrtowc 来自 C90
  • 根据每个文件之间的空行将文本文件的段落拆分为多个文件

    以前我问过同样的问题 但没有成功 可能是我在上一个问题中不清楚 这是我希望根据每个摘要之间的空行将其拆分为 3 个文件的文件 并以摘要编号作为文件名 16914261 Energetic basis of molecular recogni
  • 删除分段线(OpenCV、Python)

    给出以下代码 import numpy as np import cv2 gray cv2 imread image png edges cv2 Canny gray 50 150 apertureSize 3 cv2 imwrite ed
  • 读-复制-更新和读-写-锁之间的区别?

    从编程的角度来看 它们在我看来几乎相同 根据我在更新数据时读到的内容 RCU 需要维护旧副本 直到所有读取器都完成 这会产生很大的开销 这是实施方面的唯一区别吗 读 复制 更新 RCU 与读写锁不同 以下是我能想到的一些要点 将更新和回收信
  • 在 JAVA 中将 java.util.Date 转换为不同格式的 java.util.Date [重复]

    这个问题在这里已经有答案了 我得到的日期为 java util Date not String java util Date Mon Jul 13 00 00 00 IST 2020 我想将其转换为 2020 07 13T00 00 格式
  • GLFW三角形不会变色

    我一直在关注有关如何使用 glfw 制作基本图形的 YouTube 简短教程 我无法让我的三角形改变颜色帮助我 主要代码 include