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像素的点精灵,按照我在顶点着色器中设置的值。但是,实际执行时,窗口中央的点精灵的大小恰好是一个像素。我究竟做错了什么?
嗯,不太工作;一台电脑不会使用新代码显示点精灵,而另一台电脑完全停止。你运行代码时会得到什么结果?你是否有同样的问题,或者你看到的应该是点精灵? – fouric