c++ - glBindAttribLocation 接下来是什么?

标签 c++ opengl glfw

我正在努力寻找不需要 glew 或 glut 或其他任何东西的 OpenGL/GLSL 示例。

我正在尝试仅使用 glfw3(如果可能的话我不想使用其他库)并且我正在努力理解一旦我使用 glBindAttribLocation 之后该做什么?我已经编写代码将图像作为纹理传递到着色器中,但我不知道如何传递顶点。

我有一个顶点着色器和片段着色器我想制作一个三角形然后将其着色为红色,我可以创建着色器程序和对象程序并链接所有内容,但如何将内容传递给着色器。

// vert
in vec3 vPosition;

void main()
{
    gl_Position = vec4(vPosition,1.0);
}


// Frag
out vec4 color;
void main()
{
    color = vec4(1.0,0.0,0.0,1.0);
}

调用 glBindAttribLocation 后我不明白我需要做什么

glBindAttribLocation(p,0,"vPosition");
glUseProgram(p);

现在如何将三角形的顶点传递给着色器?

更多代码,我正在调用我自己的库来读取文件,这样如果有人试图运行它,textread 将无法工作

#include <GLFW/glfw3.h>

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

#include "src/textfile.h"

GLuint v,f,p;


void printLog(GLuint obj)
{
    int infologLength = 0;
    int maxLength;

    if(glIsShader(obj))
        glGetShaderiv(obj,GL_INFO_LOG_LENGTH,&maxLength);
    else
        glGetProgramiv(obj,GL_INFO_LOG_LENGTH,&maxLength);

    char infoLog[maxLength];

    if (glIsShader(obj))
        glGetShaderInfoLog(obj, maxLength, &infologLength, infoLog);
    else
        glGetProgramInfoLog(obj, maxLength, &infologLength, infoLog);

    if (infologLength > 0)
        printf("%s\n",infoLog);
}

static void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

void setShaders() {

    char *vs = NULL,*fs = NULL;

    v = glCreateShader(GL_VERTEX_SHADER);
    f = glCreateShader(GL_FRAGMENT_SHADER);

    vs = textFileRead("toon.vert");
    fs = textFileRead("toon.frag");

    const char * ff = fs;
    const char * vv = vs;

    glShaderSource(v, 1, &vv,NULL);
    glShaderSource(f, 1, &ff,NULL);

    free(vs);free(fs);

    glCompileShader(v);
    glCompileShader(f);

    p = glCreateProgram();
    glAttachShader(p,f);
    glAttachShader(p,v);

    glLinkProgram(p);
    //glUseProgram(p);
}

int main(void)
{
    GLFWwindow* window;

    glfwSetErrorCallback(error_callback);

    if (!glfwInit())
        exit(EXIT_FAILURE);

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);

    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);

    glfwSetKeyCallback(window, key_callback);

    while (!glfwWindowShouldClose(window))
    {
        int height, width;
        float ratio;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;
        glViewport(0, 0, width, height);
        setShaders();


        glBindAttribLocation(p,0,"vPosition");
        glUseProgram(p);
        /* Now What */


        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);

    glfwTerminate();
    exit(EXIT_SUCCESS);
}

最佳答案

您通过绘制调用(最典型的是 glDrawArrays())“将顶点传递到着色器”。

当 glDrawArrays() 命中时,当前绑定(bind)的顶点数组被发送到 GPU-land。顶点将由当前绑定(bind)的程序处理(您似乎已经弄清楚了)并且每个顶点属性将根据着色器变量的属性索引是否与顶点属性的 glVertexAttribPointer()“索引”相匹配而流入顶点着色器变量参数(您似乎正在弄清楚)。

因此,请查看 glVertexAttribPointer() 来描述您的顶点数组,查看 glEnableAttributeArray() 以使您的顶点数组能够在下一次绘制调用时发送,然后查看 glDrawArrays() 以开始派对。

关于c++ - glBindAttribLocation 接下来是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24028917/

相关文章:

c++ - std::map 不存储任何值

c++ - 在 Linux 中创建子进程并处理可能失败的最佳方法

c++ - 在 OpenGL 4.0 中绘制球体

c++ - OpenGl - 纹理 glutSolidSphere?

Java OpenGL渲染许多三角形

c++ - glfw在创建之前/创建时实例化窗口位置

c++ - 如何将 "member"添加到Qt中的MainWindow类

c++ - 规避 ld 查找

c++ - gluPerspective在什么情况下会看到顶点?

c++ - Qt5 & OpenGL : stdlib. h: 没有那个文件或目录