我正在开发一个简单的 OpenGL ES 2.0 程序(与 SDL 2 一起使事情变得更容易一些)并决定尝试点精灵。我能够让它们成功绘制,但我无法通过从顶点着色器输出 gl_PointSize 来改变它们的大小。从理论上讲,这应该是我所要做的。
下面的代码片段是我几乎没有 C++ 代码的一个非常精简的版本(根本没有错误检查,但那是因为它应该不会出错),它演示了我如何尝试更改我的点精灵的大小. 它已经在两台完全不同的计算机上进行了测试,结果相似(Linux,但 32 位/软件渲染与 64 位/离散 GPU),并且可以使用带有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 像素的点精灵。然而,当实际执行时,窗口中心的点精灵的大小正好是一个像素。我究竟做错了什么?