for sake understanding sfml and how it handles opengl internally, i have created mini-opengl program that draw simple chess board on screen. of course this can be done in sfml like this:
sf::Sprite sprite(texture);
window.draw(sprite);
as i said, the purpose of this exercise is to understand sfml and opengl as well. the same above code can be writtern in opengl like this:
#include <SFML/OpenGL.hpp>
#include <SFML/Window.hpp>
#include <vector>
int main()
{
sf::Window window(sf::VideoMode(800, 600), "OpenGL");
// Set the viewport
glViewport(0, 0, window.getSize().x, window.getSize().y);
// Initialize Projection Matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set drawing surface properties - either Perspective or Orthographic: make origin (0,0) at top-left corner of screen
glOrtho(0.0, window.getSize().x, window.getSize().y, 0.0, -1.0, 1.0);
// Initialize Modelview Matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Initialize Texture Matrix
glMatrixMode(GL_TEXTURE);
glPushMatrix();
// Initialize vertices: use window coordinate for width and height
auto width = static_cast<float>(window.getSize().x);
auto height = static_cast<float>(window.getSize().y);
std::vector<float> vertices =
{
0, 0,
0, height,
width, height,
width, 0
};
// Initialize colors
std::vector<float> colors =
{
1, 0, 0,
0, 1, 0,
0, 0, 1,
0, 1, 1
};
// Initialize texture virtice
std::vector<float> texCoord =
{
0, 0,
0, 1,
1, 1,
1, 0
};
// Create texture: simple chess board
std::vector<unsigned char> textureData(64);
for (auto i = 0u; i < textureData.size(); ++i)
textureData[i] = ((i + (i / 8)) % 2) * 128 + 127;
// Upload to GPU texture
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 8, 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, textureData.data());
glBindTexture(GL_TEXTURE_2D, 0);
// Initialize clear colors
glClearColor(0.f, 0.f, 0.f, 1.f);
while (window.isOpen())
{
sf::Event windowEvent;
while (window.pollEvent(windowEvent))
{
if (windowEvent.type == sf::Event::Closed)
window.close();
}
// render
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices.data());
glColorPointer(3, GL_FLOAT, 0, colors.data());
glTexCoordPointer(2, GL_FLOAT, 0, texCoord.data());
glDrawArrays(GL_QUADS, 0, 4);
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
window.display();
}
}
i have two questions regarding this matter:
- how sfml manged the coordinate system since it doesn't use either Perspective or Orthographic
- i would like to get code review for my implementation