Laptop Uzmanı
Decapat
- Katılım
- 26 Ağustos 2019
- Mesajlar
- 413
Daha fazla
- Cinsiyet
- Erkek
Evet internetteki konular İngilizce ve hiçbir şey anlamıyorum. En basit şekilde glut kütüphanesi ile nasıl kaplama yükleyebilirim?
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.
EyvallahÖ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.
Eki Görüntüle 946985C#: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 946988
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 kurs türkçe ama tamamlanmamış.Ama çok şey öğreneceksiniz.Türkçe kurs şart!!
Kanala girin oynatma listelerinde Modern OpenGL serileri var.
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.
Merak ediyorum hangi fonksiyonla çizim yapıyorsun.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.
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.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?
O fonksiyonlar OpenGL'in kendisinde de var zaten.Öyle çizdirmeyi denedim ama çok düşük performanslı çizyor.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.
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();
}
Böyle daha mı optimize oluyor?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(); }
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.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.
Bu sitenin çalışmasını sağlamak için gerekli çerezleri ve deneyiminizi iyileştirmek için isteğe bağlı çerezleri kullanıyoruz.