繁体   English   中英

GLSL统一浮点未正确通过

[英]GLSL Uniform float not correctly passing

我正在尝试为填满画面的四边形创建一个着色器。 但是我似乎无法将统一的浮动传递给着色器。

在以下示例中,我将初始化过剩,创建/编译和链接着色器,将统一的int和float传递给着色器,然后将它们重新检查。 int asdf工作正常,float qwer表现qwer

如果将qwer的值设置为1.3,则将统一设置为-2.0,如果将其设置为1.2,则将统一设置为2.0。

#include <stdio.h>
#include <string.h>
#include <GL/glut.h>
#include <unistd.h>

int gw = 640, gh = 360;

void drawScene(){
    //creating a screen filling quad
    glBegin(GL_QUADS);

    glTexCoord2f(0.0, 0.0f); glVertex2i(-1, 1);
    glTexCoord2f(1.0, 0.0f); glVertex2i(1, 1);
    glTexCoord2f(1.0, 1.0f); glVertex2i(1, -1);
    glTexCoord2f(0.0, 1.0f); glVertex2i(-1, -1);

    glEnd();

    glutSwapBuffers();
}

void update(int value){
    glutPostRedisplay();
    glutTimerFunc(1000 / 30, update, 0);
}

int main(int argc, char** argv){

    //shader source code

    char *fraShdrStr = "\n\
uniform int asdf;\
uniform float qwer;\
void main(){\n\
    vec2 p = gl_TexCoord[0].xy;\n\
    gl_FragColor=vec4(p.x,qwer,float(asdf),1.0);\n\
}";
    char *verShdrStr = "\n\
void main(){\n\
    gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;\n\
    gl_TexCoord[0]=gl_MultiTexCoord0;\n\
}";

    size_t verShdrLen, fraShdrLen;
    char errorBuffer[1024];
    int errorLength;
    int program, verShdr, fraShdr;
    verShdrLen = strlen(verShdrStr);
    fraShdrLen = strlen(fraShdrStr);

    //initializing glut
    glutInit(&argc, argv);
    glutInitWindowSize(gw, gh);

    glutCreateWindow("");

    //creating, compiling and linking shaders
    verShdr = glCreateShader(GL_VERTEX_SHADER);
    fraShdr = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(verShdr, 1, &verShdrStr, &verShdrLen);
    glShaderSource(fraShdr, 1, &fraShdrStr, &fraShdrLen);

    glCompileShader(verShdr);
    glGetShaderInfoLog(verShdr, 1024, &errorLength, errorBuffer);
    if(errorLength) printf("Vertex Shader Error:\n%s\n", errorBuffer);

    glCompileShader(fraShdr);
    glGetShaderInfoLog(fraShdr, 1024, &errorLength, errorBuffer);
    if(errorLength) printf("Fragmen Shader Error:\n%s\n", errorBuffer);

    program = glCreateProgram();

    glAttachShader(program, verShdr);
    glAttachShader(program, fraShdr);

    glLinkProgram(program);
    glGetProgramInfoLog(program, 1024, &errorLength, errorBuffer);
    if(errorLength) printf("Linking Error:\n%s\n", errorBuffer);



    glUseProgram(program);

    //initializing variables to pass as uniform
    int asdf = 9;
    int asdf2;
    float qwer = 1.0;
    float qwer2;

    //setting the uniform values
    glUniform1i(glGetUniformLocation(program, "asdf"), asdf);
    glGetUniformiv(program, glGetUniformLocation(program, "asdf"), &asdf2);
    printf("%d\n", asdf2);

    glUniform1f(glGetUniformLocation(program, "qwer"), qwer);
    glGetUniformfv(program, glGetUniformLocation(program, "qwer"), &qwer2);
    printf("%f\n", qwer2);


    glutDisplayFunc(drawScene);
    glutTimerFunc(1000/30, update, 0);

    glutMainLoop();
}

您误会了整个画面。 由于OpenGL 3.0不推荐使用glBegin/glEnd绘制东西。 相反,您应该使用基于所谓的“顶点数组”的方法。 查看此问题以获取示例代码片段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM