【问题标题】:glBindAttribLocation whats next?glBindAttribLocation 下一步是什么?
【发布时间】:2014-06-05 05:07:00
【问题描述】:

我正在努力寻找不需要 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);
}

【问题讨论】:

  • 请注意,对glBindAttribLocation的调用只有在链接着色器程序后才会生效,因此您需要将调用移至setShaders函数。
  • 我就是这样设置 setShaders();链接着色器然后我调用glBindAttribLocation,然后我使用程序,但是在它告诉它使用程序之后我不明白如何使用着色器。如何将顶点传递给顶点着色器

标签: c++ opengl glfw


【解决方案1】:

您通过调用绘制调用“将顶点传递给着色器”,最常见的是 glDrawArrays()。

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

所以,查看 glVertexAttribPointer() 来描述您的顶点数组,查看 glEnableAttributeArray() 以使您的顶点数组能够在下一次绘制调用中发送,然后使用 glDrawArrays() 来开始聚会。

【讨论】:

    【解决方案2】:

    您不需要调用 glBindAttribLocation,而是使用 glGetAttribLocation

    1 在你的 cpp 文件中定义属性变量

    GLint vPosition
    

    2 绑定着色器变量

    const char* attribute_name = "vPosition"; 
    attribute_coord2d = glGetAttribLocation(p, attribute_name);
    

    3 在顶点着色器文件中,将vPosition定义为属性变量并使用它。

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

    【讨论】:

    • 我已经知道我选择以不同的方式来做这件事。但我坚持的是使用它的部分。在哪里提供顶点?在我使用了 glgetattribloction/glbindattriblocation 之后呢?
    • 使用 glBindAttribLocation 对于标准化属性位置很有用,这样您就可以使用具有相同着色器的不同网格,反之亦然。
    猜你喜欢
    • 2021-09-23
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多