2014-02-07 72 views
0

我正在研究一个简单的OpenGL ES 2.0程序(与SDL 2一起使事情变得更容易),并决定尝试点精灵。我能够让它们成功绘制,但我无法通过从顶点着色器输出gl_PointSize来改变它们的大小。理论上,这应该是我必须做的。为什么这个简单的OpenGL ES 2.0/SDL 2程序让我改变点精灵的大小?

以下代码片段是我的几乎C++代码的一个非常简洁的版本(没有错误检查在所有,但这是因为没有应该出错),演示了我如何改变我的点精灵的大小。它已经在具有相似结果的两台相当不同的计算机上进行了测试(Linux,但是32位/软件渲染与64位/独立GPU),并且可以使用g ++与g++ main.cpp -lSDL2 -Wall -D_REENTRANT -lGLESv2进行编译。

#include <GLES2/gl2.h> 
#include <SDL2/SDL.h> 

struct myData { 
    SDL_Window *window; 
    SDL_GLContext context; 
}; 

const GLchar vertex[] = 
    "#version 100\n" 
    "precision mediump float;\n" 
    "void main()\n" 
    "{\n" 
    " gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n" 
    " gl_PointSize = 128.0;\n" 
    "}\0"; 

const GLchar fragment[] = 
    "#version 100\n" 
    "precision mediump float;\n" 
    "void main()\n" 
    "{\n" 
    " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" 
    "}\0"; 

GLuint loadShader(GLuint program, GLenum type, const GLchar *shaderSrc) { 
    GLuint shader; 
    shader = glCreateShader(type); 
    glShaderSource(shader, 1, &shaderSrc, NULL); 
    glCompileShader(shader); 
    glAttachShader(program, shader); 
    return 0; 
} 

int sdlInit(myData *data) { 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 

    data->window = SDL_CreateWindow("Demo", 0, 0, 512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); 
    data->context = SDL_GL_CreateContext(data->window); 

    return 0; 
} 

int glInit(myData *data) { 
    GLuint programObject; 
    programObject = glCreateProgram(); 
    loadShader(programObject, GL_VERTEX_SHADER, vertex); 
    loadShader(programObject, GL_FRAGMENT_SHADER, fragment); 
    glLinkProgram(programObject); 
    glUseProgram(programObject); 

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glViewport(0, 0, 512, 512); 

    return 0; 
} 

int loopFunc(myData *data) { 
    SDL_Event event; 
    while (SDL_PollEvent(&event)) { 
     if (event.type == SDL_QUIT) { 
      return 1; 
     } 
    } 

    glClear(GL_COLOR_BUFFER_BIT); 
    glDrawArrays(GL_POINTS, 0, 1); 
    SDL_GL_SwapWindow(data->window); 

    return 0; 
} 

void sdlQuit(myData *data) { 
    SDL_GL_DeleteContext(data->context); 
    SDL_DestroyWindow(data->window); 
    SDL_Quit(); 
    return; 
} 

int main() { 
    myData data; 

    sdlInit(&data); 

    glInit(&data); 

    while (!loopFunc(&data)); 

    sdlQuit(&data); 

    return 0; 
} 

运行时,程序应该产生一个大小为128像素的点精灵,按照我在顶点着色器中设置的值。但是,实际执行时,窗口中央的点精灵的大小恰好是一个像素。我究竟做错了什么?

回答

0

我想你忘了初始化opengles2上下文。

SDL_Init(SDL_INIT_VIDEO); 

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); 

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 
+0

嗯,不太工作;一台电脑不会使用新代码显示点精灵,而另一台电脑完全停止。你运行代码时会得到什么结果?你是否有同样的问题,或者你看到的应该是点精灵? – fouric

相关问题