【问题标题】:OpenGL ES2 coloured triangleOpenGL ES2 彩色三角形
【发布时间】:2012-05-18 06:27:12
【问题描述】:

我正在尝试在 opengl es 2 中制作基本三角形,但无论我做什么,它似乎都不起作用.. 我得到的只是一个白色三角形。不过我觉得可能有问题 链接程序时(那是我禁用了链接检查“if”的返回,否则它根本不会运行)。此外,当我使用控制台运行时,我得到输出“错误:1281”。我的代码:

int loadShader(int type, char * shaderCode)
{
    int length = strlen(shaderCode);

    int shader = glCreateShader(type);
    glShaderSource(shader, 1, (const char **) &shaderCode, NULL);
    glCompileShader(shader);

    return shader;
}

// Initializes the application data
int Init(void) 
{
    // Vertex shaders
    char * vertexShaderCode = 
        "attribute vec4 vPosition; \n" 
        "void main() {             \n" 
        " gl_Position = vPosition; \n"  
        "}                         \n";

    char * fragmentShaderCode = 
        "precision mediump float;                 \n"
        "void main() {                            \n"
        " gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);\n"
        "}                                        \n";

    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, vertexShaderCode);
    GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentShaderCode);
    GLint linked;

    program = glCreateProgram();

    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glBindAttribLocation(program, 0, "vPosition");
    glLinkProgram(program);

    glGetProgramiv(program, GL_LINK_STATUS, &linked);

    if(!linked)
    {
       GLint infoLen = 0;
       glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
       if(infoLen > 1)
       {
          char* infoLog = (char *) malloc(sizeof(char) * infoLen);
          glGetProgramInfoLog(program, infoLen, NULL, infoLog);
          free(infoLog);
       }
       glDeleteProgram(program);
       //return 0;
    }

    // Basic GL setup
    glClearColor    (0.0, 0.0, 0.0, 1.0);

    return GL_TRUE;
}



// Main-loop workhorse function for displaying the object
void Display(void)
{
    // Clear the screen
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0, 0.0, 0.0, 1.0);   


    GLfloat vertices[] = {
        -0.5f, 0.0f, -1.0f,
        0.0f, 1.0f, -1.0f,
        0.5f, 0.0f, -1.0f,
    };

    GLfloat colors[] = {
        0.0f, 0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f, 1.0f,
    };


    glUseProgram(program);


    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
    glEnableVertexAttribArray(0);


    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, colors);
    glEnableVertexAttribArray(1);

    glDrawArrays(GL_TRIANGLES,  0, 3);
}

【问题讨论】:

  • 尝试找出是哪一行代码产生了错误。
  • 您是否尝试过记录以查看会发生什么?有glGetShaderInfoLog 可以获取有关着色器程序的信息。对于 opengl,请参阅 glGetError
  • @Tim,说起来容易做起来难。我尝试添加退出函数并将其跟踪到链接的 if,它看起来像是进入了它,但跳过了 infoLen,所以我真的不知道发生了什么。
  • @VJovic,谢谢,我会看看那些。
  • 使用 vec4(0.0f, 0.0f, 0.0f, 1.0f) 代替 vec4(0.5f, 0.5f, 0.5f, 1.0f) 可能会使显示器上的灰色看起来更白。然后再试一次: glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, colors); glEnableVertexAttribArray(1);希望这会有所帮助:)

标签: c++ opengl-es


【解决方案1】:

先启用顶点属性数组,然后传递指针...

glEnableVertexAttribArray(0);    
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);

glDrawArrays(GL_TRIANGLES,  0, 3);

您也在“1”属性数组中发送颜色,但着色器中没有这样的属性。

【讨论】:

  • 但它仍然是白色三角形。我不认为这是问题所在。着色器是否有问题,因为它没有读取“gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);”?
  • 对我来说,白色表示着色器无法正常工作……而 opengl 使用自己的后备代码进行光栅化。也许您可以在 gDebugger 或某些 RenderMonkey 中调试这些悲伤器?另一个建议:顶点属性的精度如何?不应该是attrib mediump vec4 vPostion吗?什么 line " "precision mediump float; "是什么意思?没有变量名!?
  • webreference.com/programming/opengl_es/2.html 在片段着色器中,在很多教程中,所以它可能是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多