【问题标题】:GLSL Uniform float not correctly passingGLSL 统一浮点数未正确通过
【发布时间】:2015-10-15 10:09:45
【问题描述】:

我正在尝试为场景填充四边形创建着色器。但我似乎无法将统一的浮点数传递给着色器。

在以下示例中,我正在初始化 glut,创建/编译和链接着色器,将统一的 int 和浮点数传递给着色器,然后让它们返回检查。 int asdf 工作正常,float qwer 行为怪异。

如果我将qwer 的值设置为1.3,则uniform 设置为-2.0,如果我将其设置为1.2,则uniform 设置为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();
}

【问题讨论】:

    标签: c glsl glut freeglut


    【解决方案1】:

    你误解了整个画面。由于 OpenGL 3.0 使用 glBegin/glEnd 来绘制东西已被弃用。相反,您应该使用一种方法,基于使用所谓的顶点数组。查看this question 获取示例代码 sn-p。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多