OpenGL C++ glut ile texture yükleme

Önce resim dosyasını alıp belleğe yükleyen ve pointerini sana veren bi api kullan.
Fonsiyonların mantığını sana tek tek anlatacağım.Ben c# tayım ama fonsiyonlar aynı c++ da.

C#:
GL.Enable(EnableCap.Texture2D);
texture = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, texture);

//Burası benim kullandığım resmi RAM'e yükleme API'si
//Başka bir API'de olur yani
//Resmin yerini verdim
Bitmap bitmap = new Bitmap(@"C:\Users\osman\Pictures\BlueStacks\maxresdefault.jpg");
//Resmi RAM'e verdim
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

//OpenGL'e resmin bulunduğu adresi verdim.                                                                                                                     Resmin RAM'deki yerine pointer
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);

//OpenGL zaten resmi kendine kopyaladı artık buna ihtiyacım yok.Bunu RAM'den siliyorum
bitmap.UnlockBits(data);
bitmap.Dispose();

//Bu fonsiyon resmin ST si yani UV si taşarsa resmin tekramı edeceğini yoksa sabit mi kalacağını opengl'e söylüyoruz
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder);
 GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT,(int)TextureWrapMode.ClampToBorder);

//Düşük çözünürlüklü resimlerin pikselli mi yoksa bulanıkmı gözükeceğini OpenGL'e söylüyoruz
 GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);

 GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
//Texture'ın çalışmması için ya mipmap yapmamız.Yada resmin Pikselli mi bulanıkmı gözükecceğini ve taşma olduğunda tekrar etmesi mi yoksa sabit kalmasını mıı.Bunları söylemeliyiz.
1617024687298.png

1617024811726.png
 
Son düzenleme:
Önce resim dosyasını alıp belleğe yükleyen ve pointerini sana veren bi api kullan.
Fonsiyonların mantığını sana tek tek anlatacağım.Ben c# tayım ama fonsiyonlar aynı c++ da.

C#:
GL.Enable(EnableCap.Texture2D);
texture = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, texture);

//Burası benim kullandığım resmi RAM'e yükleme API'si
//Başka bir API'de olur yani
//Resmin yerini verdim
Bitmap bitmap = new Bitmap(@"C:\Users\osman\Pictures\BlueStacks\maxresdefault.jpg");
//Resmi RAM'e verdim
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

//OpenGL'e resmin bulunduğu adresi verdim.                                                                                                                     Resmin RAM'deki yerine pointer
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);

//OpenGL zaten resmi kendine kopyaladı artık buna ihtiyacım yok.Bunu RAM'den siliyorum
bitmap.UnlockBits(data);
bitmap.Dispose();

//Bu fonsiyon resmin ST si yani UV si taşarsa resmin tekramı edeceğini yoksa sabit mi kalacağını opengl'e söylüyoruz
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT,(int)TextureWrapMode.ClampToBorder);

//Düşük çözünürlüklü resimlerin pikselli mi yoksa bulanıkmı gözükeceğini OpenGL'e söylüyoruz
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
//Texture'ın çalışmması için ya mipmap yapmamız.Yada resmin Pikselli mi bulanıkmı gözükecceğini ve taşma olduğunda tekrar etmesi mi yoksa sabit kalmasını mıı.Bunları söylemeliyiz.
Eki Görüntüle 946985
Eki Görüntüle 946988
Eyvallah
 
Bu kurs türkçe ama tamamlanmamış.Ama çok şey öğreneceksiniz.Türkçe kurs şart!!
Kanala girin oynatma listelerinde Modern OpenGL serileri var.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 
Bu kurs türkçe ama tamamlanmamış.Ama çok şey öğreneceksiniz.Türkçe kurs şart!!
Kanala girin oynatma listelerinde Modern OpenGL serileri var.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
Bu arada bu konuyu 7 Mart ta açmışım. Zaten o gün bugündür, bayağı ilerleme gösterdim. Şu an opengl i %60 çözdüm.
Bu arada bu konuyu 7 Mart ta açmışım. Zaten o gün bugündür, bayağı ilerleme gösterdim. Şu an opengl i %60 çözdüm.
Cevabı attığın zaman zaten textureları öğrenmiştim. Yine de teşekkür ettim.
 
Bu arada bu konuyu 7 Mart ta açmışım. Zaten o gün bugündür, bayağı ilerleme gösterdim. Şu an opengl i %60 çözdüm.

Cevabı attığın zaman zaten textureları öğrenmiştim. Yine de teşekkür ettim.
Merak ediyorum hangi fonksiyonla çizim yapıyorsun.
DrawArrays() mi yoksa DrawElemnts() mi?

Ben indexli bir şekilde vertexleri çizmek istiyorum ancak sadece pozisyon için indisler var.
Pozisyon indisleri normallere ve UV lere uymuyor.
Ben normal için,UV ler içinde index kullanmak istiyorum ama yapamıyorum.
Indexlere göre vertexleri tekrar dizip uygun hale getirebilirim ancak bu daha maliyetli.

Sen nasıl renderlıyorsun?
 
Merak ediyorum hangi fonksiyonla çizim yapıyorsun.
DrawArrays() mi yoksa DrawElemnts() mi?

Ben indexli bir şekilde vertexleri çizmek istiyorum ancak sadece pozisyon için indisler var.
Pozisyon indisleri normallere ve UV lere uymuyor.
Ben normal için,UV ler içinde index kullanmak istiyorum ama yapamıyorum.
Indexlere göre vertexleri tekrar dizip uygun hale getirebilirim ancak bu daha maliyetli.

Sen nasıl renderlıyorsun?
Ben glut kullanıyorum. glut kütüphanesinde de çizim yapmak için önce uv koordinatlarını sonra da yüzeyin koordinatlarını girmek gerekiyor. Glutta bir görüntüleme fonksiyonu tanımılıyorsun. GlBegin ile başlatıyorum. Mesela dikdörtgen... Onun köşelerini ve köşe renklerini giriyorum.
 
Ben glut kullanıyorum. glut kütüphanesinde de çizim yapmak için önce uv koordinatlarını sonra da yüzeyin koordinatlarını girmek gerekiyor. Glutta bir görüntüleme fonksiyonu tanımılıyorsun. GlBegin ile başlatıyorum. Mesela dikdörtgen... Onun köşelerini ve köşe renklerini giriyorum.
O fonksiyonlar OpenGL'in kendisinde de var zaten.Öyle çizdirmeyi denedim ama çok düşük performanslı çizyor.
O fonksiyonları kullanarak CS 1.6 daki dust2 haritasını 25 fps'le çizdiriyordu OpenGL.
Bu fonksiyonlar hemen hemen bütün yükü işlemciye bindiriyor.

Ben böyle çizdiriyorum
C#:
float[] quad = new float[]
{
    //Posisyonlar
    -0.5f,-0.5f,0.0f,
    -0.5f,0.5f,0.0f,
    0.5f,0.5f,0.0f,
    0.5f,-0.5f,0.0f,

    //UV koordinatları
    0.0f,1.0f,
    0.0f,0.0f,
    1.0f,0.0f,
    1.0f,1.0f

}

int vao, vbo;

protected override void OnLoad(EventArgs e)
{
    GL.Viewport(0, 0, Width, Height);

    vao = GL.GenVertexArray();
    vbo = GL.GenBuffer();

    GL.EnableClientState(ArrayCap.VertexArray);

    GL.BindVertexArray(vao);
    GL.EnableVertexArrayAttrib(vao, 0);
    GL.EnableVertexArrayAttrib(vao, 1);

    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);   

    GL.BufferData(BufferTarget.ArrayBuffer, quad.Length * sizeof(float), quad, BufferUsageHint.StaticDraw);
    GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0);
    GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 0, sizeof(float) * 4); 
}



protected override void OnRenderFrame(FrameEventArgs e)
{

    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

    GL.BindVertexArray(vao);
    GL.DrawArrays(PrimtiveType.Quads, 0, 4);

    SwapBuffers();
}
 
Son düzenleme:
O fonksiyonlar OpenGL'in kendisinde de var zaten.Öyle çizdirmeyi denedim ama çok düşük performanslı çizyor.
O fonksiyonları kullanarak CS 1.6 daki dust2 haritasını 25 fps'le çizdiriyordu OpenGL.
Bu fonksiyonlar hemen hemen bütün yükü işlemciye bindiriyor.

Ben böyle çizdiriyorum
C#:
float[] quad = new float[]
{
    //Posisyonlar
    -0.5f,-0.5f,0.0f,
    -0.5f,0.5f,0.0f,
    0.5f,0.5f,0.0f,
    0.5f,-0.5f,0.0f,

    //UV koordinatları
    0.0f,1.0f,
    0.0f,0.0f,
    1.0f,0.0f,
    1.0f,1.0f

}

int vao, vbo;

protected override void OnLoad(EventArgs e)
{
    GL.Viewport(0, 0, Width, Height);

    vao = GL.GenVertexArray();
    vbo = GL.GenBuffer();

    GL.EnableClientState(ArrayCap.VertexArray);

    GL.BindVertexArray(vao);
    GL.EnableVertexArrayAttrib(vao, 0);
    GL.EnableVertexArrayAttrib(vao, 1);

    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);    

    GL.BufferData(BufferTarget.ArrayBuffer, quad.Length * sizeof(float), quad, BufferUsageHint.StaticDraw);
    GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, 0, 0);
    GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 0, sizeof(float) * 4);  
}



protected override void OnRenderFrame(FrameEventArgs e)
{

    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

    GL.BindVertexArray(vao);
    GL.DrawArrays(PrimtiveType.Quads, 0, 4);

    SwapBuffers();
}
Böyle daha mı optimize oluyor?
[CODE lang="cpp" title="c++"]#include <SFML/Graphics.hpp>
#include <iostream>
#include <glut.h>
#include <Windows.h>


int keyokuma = 0, width, height, hx, hy, hz;
unsigned char Ke;
float angle = 1;

GLuint dir;
GLuint tex;
float aspect;
static void timer(int value) {
glutPostRedisplay();
glutTimerFunc(10, timer, value);
}
void kup(int x, int y, int z, int büyüklük) {


glBegin(GL_QUADS);
glColor4f(1, 1, 1, 1);
glTexCoord2i(0, 0); glVertex3i(x + büyüklük, y - büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x - büyüklük, y - büyüklük, z - büyüklük);
glTexCoord2i(1, 1); glVertex3i(x - büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x + büyüklük, y - büyüklük, z + büyüklük);

glTexCoord2i(0, 0); glVertex3i(x + büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x - büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(1, 1); glVertex3i(x - büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x + büyüklük, y + büyüklük, z + büyüklük);

glTexCoord2i(0, 0); glVertex3i(x + büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x + büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 1); glVertex3i(x + büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x + büyüklük, y - büyüklük, z - büyüklük);

glTexCoord2i(0, 0); glVertex3i(x - büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x - büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 1); glVertex3i(x - büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x - büyüklük, y - büyüklük, z - büyüklük);

glTexCoord2i(0, 0); glVertex3i(x - büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(0, 1); glVertex3i(x + büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 1); glVertex3i(x + büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x - büyüklük, y - büyüklük, z + büyüklük);

glTexCoord2i(0, 0); glVertex3i(x - büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x + büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(1, 1); glVertex3i(x + büyüklük, y - büyüklük, z - büyüklük);
glTexCoord2i(1, 0); glVertex3i(x - büyüklük, y - büyüklük, z - büyüklük);

glEnd();




}
void HandleGLError()
{
GLenum error;
int i = 0;
while ((error = glGetError()) != GL_NO_ERROR) {
std::cout << "GL ERROR(%d) %s\n" << i << gluErrorString(error) << std::endl;
i++;
}
}


void render() {

glClearColor(0, 0, 0.0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glBindTexture(GL_TEXTURE_2D, tex);
kup(10, 0, -400, 20);

glBindTexture(GL_TEXTURE_2D, dir);
kup(51, 0, -400, 20);

glBindTexture(GL_TEXTURE_2D, tex);
kup(-31, 0, -400, 20);

glBindTexture(GL_TEXTURE_2D, dir);
kup(-72, 0, -400, 20);


glFlush();






}


void MyKeyboardFunc(unsigned char Ke, int x, int y) {

if (Ke == 'e')
{
exit(0);
Ke = NULL;
}
if (Ke == 'w')
{
gluLookAt(0,0,-10,0,0,-100,0,1,0);

Ke = NULL;
}
if (Ke == 's')
{
gluLookAt(0, 0, 10, 0,0,-100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'a')
{
gluLookAt(-10, 0, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'd')
{
gluLookAt(10, 0, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'z')
{
gluLookAt(0, -10, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'x')
{
gluLookAt(0, 10, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'y')
{

gluLookAt(0, 0, 0, 0, 5, -100, 0, 1, 0);
}
if (Ke == 'h')
{

gluLookAt(0, 0, 0, 0, -5, -100, 0, 1, 0);
}

}
void spe(int key, int x, int y) {
std::cout << key;
}
int eskix, eskiy;
void glutMouFunc(int x, int y) {

}
void GetDesktopResolution(int& horizontal, int& vertical)
{
RECT desktop;
// Get a handle to the desktop window
const HWND hDesktop = GetDesktopWindow();
// Get the size of screen to the variable desktop
GetWindowRect(hDesktop, &desktop);
// The top left corner will have coordinates (0,0)
// and the bottom right corner will have coordinates
// (horizontal, vertical)
horizontal = desktop.right;
vertical = desktop.bottom;
}

int main(int argc, char** argv)
{
hx = 0;
hy = 0;
hz = -100;
/* FreeConsole();*/

GetDesktopResolution(width, height);
aspect = 1.7;

//create GL context
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(width, height);
glutCreateWindow("windowname");
glutFullScreen();
sf::Image resim, dirt;
resim.loadFromFile("tex.jpg");
dirt.loadFromFile("dirt.jpg");
//upload to GPU texture

glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
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_RGBA, resim.getSize().x, resim.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, resim.getPixelsPtr());
glBindTexture(GL_TEXTURE_2D, 0);


glGenTextures(1, &dir);
glBindTexture(GL_TEXTURE_2D, dir);
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_RGBA, dirt.getSize().x, dirt.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, dirt.getPixelsPtr());
glBindTexture(GL_TEXTURE_2D, 0);

glBindTexture(GL_TEXTURE_2D, tex);
glEnable(GL_TEXTURE_2D);
glutDisplayFunc(render);
glutKeyboardFunc(MyKeyboardFunc);
glutSpecialFunc(spe);

glutPassiveMotionFunc(glutMouFunc);
glMatrixMode(GL_PROJECTION);
gluPerspective(45.0f, aspect, 10, 1000);
glMatrixMode(GL_MODELVIEW);



glShadeModel(GL_SMOOTH);

glEnable(GL_DEPTH_TEST | GL_POLYGON_SMOOTH);





timer(1);
glutMainLoop();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
HandleGLError();
return 0;
}[/CODE]
Böyle kullanıyordum ben.
Böyle daha mı optimize oluyor?
[CODE lang="cpp" title="c++"]#include <SFML/Graphics.hpp>
#include <iostream>
#include <glut.h>
#include <Windows.h>


int keyokuma = 0, width, height, hx, hy, hz;
unsigned char Ke;
float angle = 1;

GLuint dir;
GLuint tex;
float aspect;
static void timer(int value) {
glutPostRedisplay();
glutTimerFunc(10, timer, value);
}
void kup(int x, int y, int z, int büyüklük) {


glBegin(GL_QUADS);
glColor4f(1, 1, 1, 1);
glTexCoord2i(0, 0); glVertex3i(x + büyüklük, y - büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x - büyüklük, y - büyüklük, z - büyüklük);
glTexCoord2i(1, 1); glVertex3i(x - büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x + büyüklük, y - büyüklük, z + büyüklük);

glTexCoord2i(0, 0); glVertex3i(x + büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x - büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(1, 1); glVertex3i(x - büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x + büyüklük, y + büyüklük, z + büyüklük);

glTexCoord2i(0, 0); glVertex3i(x + büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x + büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 1); glVertex3i(x + büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x + büyüklük, y - büyüklük, z - büyüklük);

glTexCoord2i(0, 0); glVertex3i(x - büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x - büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 1); glVertex3i(x - büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x - büyüklük, y - büyüklük, z - büyüklük);

glTexCoord2i(0, 0); glVertex3i(x - büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(0, 1); glVertex3i(x + büyüklük, y + büyüklük, z + büyüklük);
glTexCoord2i(1, 1); glVertex3i(x + büyüklük, y - büyüklük, z + büyüklük);
glTexCoord2i(1, 0); glVertex3i(x - büyüklük, y - büyüklük, z + büyüklük);

glTexCoord2i(0, 0); glVertex3i(x - büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(0, 1); glVertex3i(x + büyüklük, y + büyüklük, z - büyüklük);
glTexCoord2i(1, 1); glVertex3i(x + büyüklük, y - büyüklük, z - büyüklük);
glTexCoord2i(1, 0); glVertex3i(x - büyüklük, y - büyüklük, z - büyüklük);

glEnd();




}
void HandleGLError()
{
GLenum error;
int i = 0;
while ((error = glGetError()) != GL_NO_ERROR) {
std::cout << "GL ERROR(%d) %s\n" << i << gluErrorString(error) << std::endl;
i++;
}
}


void render() {

glClearColor(0, 0, 0.0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glBindTexture(GL_TEXTURE_2D, tex);
kup(10, 0, -400, 20);

glBindTexture(GL_TEXTURE_2D, dir);
kup(51, 0, -400, 20);

glBindTexture(GL_TEXTURE_2D, tex);
kup(-31, 0, -400, 20);

glBindTexture(GL_TEXTURE_2D, dir);
kup(-72, 0, -400, 20);


glFlush();






}


void MyKeyboardFunc(unsigned char Ke, int x, int y) {

if (Ke == 'e')
{
exit(0);
Ke = NULL;
}
if (Ke == 'w')
{
gluLookAt(0,0,-10,0,0,-100,0,1,0);

Ke = NULL;
}
if (Ke == 's')
{
gluLookAt(0, 0, 10, 0,0,-100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'a')
{
gluLookAt(-10, 0, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'd')
{
gluLookAt(10, 0, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'z')
{
gluLookAt(0, -10, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'x')
{
gluLookAt(0, 10, 0, 0, 0, -100, 0, 1, 0);
Ke = NULL;
}
if (Ke == 'y')
{

gluLookAt(0, 0, 0, 0, 5, -100, 0, 1, 0);
}
if (Ke == 'h')
{

gluLookAt(0, 0, 0, 0, -5, -100, 0, 1, 0);
}

}
void spe(int key, int x, int y) {
std::cout << key;
}
int eskix, eskiy;
void glutMouFunc(int x, int y) {

}
void GetDesktopResolution(int& horizontal, int& vertical)
{
RECT desktop;
// Get a handle to the desktop window
const HWND hDesktop = GetDesktopWindow();
// Get the size of screen to the variable desktop
GetWindowRect(hDesktop, &desktop);
// The top left corner will have coordinates (0,0)
// and the bottom right corner will have coordinates
// (horizontal, vertical)
horizontal = desktop.right;
vertical = desktop.bottom;
}

int main(int argc, char** argv)
{
hx = 0;
hy = 0;
hz = -100;
/* FreeConsole();*/

GetDesktopResolution(width, height);
aspect = 1.7;

//create GL context
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(width, height);
glutCreateWindow("windowname");
glutFullScreen();
sf::Image resim, dirt;
resim.loadFromFile("tex.jpg");
dirt.loadFromFile("dirt.jpg");
//upload to GPU texture

glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
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_RGBA, resim.getSize().x, resim.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, resim.getPixelsPtr());
glBindTexture(GL_TEXTURE_2D, 0);


glGenTextures(1, &dir);
glBindTexture(GL_TEXTURE_2D, dir);
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_RGBA, dirt.getSize().x, dirt.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, dirt.getPixelsPtr());
glBindTexture(GL_TEXTURE_2D, 0);

glBindTexture(GL_TEXTURE_2D, tex);
glEnable(GL_TEXTURE_2D);
glutDisplayFunc(render);
glutKeyboardFunc(MyKeyboardFunc);
glutSpecialFunc(spe);

glutPassiveMotionFunc(glutMouFunc);
glMatrixMode(GL_PROJECTION);
gluPerspective(45.0f, aspect, 10, 1000);
glMatrixMode(GL_MODELVIEW);



glShadeModel(GL_SMOOTH);

glEnable(GL_DEPTH_TEST | GL_POLYGON_SMOOTH);





timer(1);
glutMainLoop();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
HandleGLError();
return 0;
}[/CODE]
Böyle kullanıyordum ben.
Neyse ben zaten şu an 2d ye döndüm. SFML kullanıyorum tüm multimedya işlemlerimi görüyor. Ben 2d geliştirecektim zaten denemek için 3d opengl denedim.
 
Son düzenleme:
3D ve 2D arasındaki zorluk seviyesinde fark yok ikiside aynı.Benim dediğim şey tek tek glvertex3() yazmak yerine VertexArray DrawElements() kullanman.Çok daha yüksek performans veriyor.Ama hangisini kullanacağın sana kalmış.Bence 3D'yi bırakma.Eğer 3D'yi öğrenirsen 2D çok kolay gelecek.

Benim ilk postta gönderdiğim OpenGL serisini izlemeni tavsiye ederim.
İçinde başka yerde bulamayacağın önemli bilgiler var.
 

Geri
Yukarı