باسلام.
من میخوام یک عکس را به جای رنگ روی سطح یک مثلث بگذارم. طریقه رسم مثلث با اپن جی ال را میدانم ولی در لود کردن عکس و قرار دادن آن اشکال دارم.در نوشتن کد راهنماییم کنید. ممنون
Printable View
باسلام.
من میخوام یک عکس را به جای رنگ روی سطح یک مثلث بگذارم. طریقه رسم مثلث با اپن جی ال را میدانم ولی در لود کردن عکس و قرار دادن آن اشکال دارم.در نوشتن کد راهنماییم کنید. ممنون
سلام
اول باد نرمال رو مشخص کنی
بعد UV رو
بعد تکسچر رو روش بدی
یه رفرنس خوب
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
این ها را باید داخل تابع صدا زده شده glDisplayFuc بنویسم؟
و بجای texture& باید اسم عکس bmp بزارم ؟ مثلا grass.bmp ؟
از این مطلبی که خوندم اینجوری برداشت کردم و این کدو نوشتم ولی جوابی نمیده!!! خیلی سعی کردم ولی نمیشه لطفا راهنمایی کنید.
کد:#include <windows.h>
#include "stdafx.h"
#include <gl/glut.h>
#include <stdio.h>
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
void Init (void)
{
glClearColor (1.0 , 1.0 , 1.0 , 0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D ( 0.0 , 300.0 , 0.0, 300.0);
}
GLuint LoadTextureRAW( const char * filename, int wrap )
{
GLuint texture;
int width, height;
BYTE * data;
FILE * file;
// open texture data
file = fopen( "texture.raw", "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data = malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
// allocate a texture name
glGenTextures( 1, &texture );
// select our current texture
glBindTexture( GL_TEXTURE_2D, texture );
// select modulate to mix texture with color for shading
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
// when texture area is small, bilinear filter the closest mipmap
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
// when texture area is large, bilinear filter the first mipmap
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// if wrap is true, the texture wraps over at the edges (repeat)
// ... false, the texture ends at the edges (clamp)
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
wrap ? GL_REPEAT : GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
wrap ? GL_REPEAT : GL_CLAMP );
// build our texture mipmaps
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,
GL_RGB, GL_UNSIGNED_BYTE, data );
// free buffer
free( data );
return texture;
}
void three (void)
{
GLuint texture;
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
// when texture area is large, bilinear filter the original
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// the texture wraps over at the edges (repeat)
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
int width, height;
BYTE * data;
FILE * file;
// texture data
width = 256;
height = 256;
// allocate buffer
data = malloc( width * height * 3 );
// open and read texture data
file = fopen( "texture.raw", "rb" );
fread( data, width * height * 3, 1, file );
fclose( file );
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,
GL_RGB, GL_UNSIGNED_BYTE, data );
free( data );
texture = LoadTextureRAW( "texture.raw", TRUE );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(0.0,0.0);
glTexCoord2d(1.0,0.0); glVertex2d(1.0,0.0);
glTexCoord2d(1.0,1.0); glVertex2d(1.0,1.0);
glTexCoord2d(0.0,1.0); glVertex2d(0.0,1.0);
glEnd();
glFlush();
}
void main(int argc, char** argv)
{
glutInit (&argc , argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (800 , 300);
glutInitWindowSize (300 , 300);
glutCreateWindow ("Shapes");
Init ();
glutDisplayFunc (three);
glutMainLoop ();
}
این سوال رو تو انجمن برنامه نویسی بپرسید سریع جواب بگیرید
(اول این که کدی که دارید می نویسید خیلی قدیمیه. اگه برای درسه اشکالی نداره. اما اگه دارید خودآموز میخونید کتابی رو که دارید از روش می خونیدو بندازید دور و یه کتاب جدید تر بردارید! :n01:)
نکته اول این که لازم نیست هر بار موقع رندر گرفتن یه بار فایل تکسچر رو لود کنید. کافیه texture رو بایند کنید.
دوم این که دارید فایل bmp رو اشتباه می خونید. bmp خودش هدر و ... داره. می تونید از کتابخونه هایی مثل glimg یا کتابخونه های دیگه استفاده کنید.
سوم این که چرا gluOrtho2D ( 0.0 , 300.0 , 0.0, 300.0)؟ مربعی که می کشید یک در یکه و تو 300 در 300 گم می شه...
پیشنهاد من اینه که برای شروع کار به جای این که آرایه دیتا رو از تو فایل بخونید یه تابع بنویسید که آرایه رو دستی پر کنه. مثل این:
[PHP]void fill_texture(BYTE* data, int width, int height){ for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { data[i * width * 3 + j * 3 + 0] = i; data[i * width * 3 + j * 3 + 1] = j; data[i * width * 3 + j * 3 + 2] = 127; }}[/PHP]
از راهنمایی همه ممنون. ولی بازم نتونستم! مطالبی که میخونم خیلی پیچیدست.
فکر کنم بهتره بیشتر توضیح بدید! :)
ببینید تا اینجا برنامه! حالا چی به کجای برنامه اضافه کنم که یه عکس به نام grass.bmp به جای مثلث قرار بگیرد.
کد:#include <windows.h>
#include "stdafx.h"
#include <gl/glut.h>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
void Init (void)
{
glClearColor (1.0 , 1.0 , 1.0 , 0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D ( 0.0 , 300.0 , 0.0, 300.0);
}
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (0.0 , 1.0 , 1.0);
glBegin(GL_TRIANGLES);
glVertex2i (150 , 225);
glVertex2i (75 , 75);
glVertex2i (225 , 75);
glEnd();
glFlush ();
}
void main(int argc, char** argv)
{
glutInit (&argc , argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (100 , 100);
glutInitWindowSize (300 , 300);
glutCreateWindow ("Shape");
Init ();
glutDisplayFunc (draw);
glutMainLoop ();
}
فقط باید به جای fill_texture باید یه تابع بذارید که فایل grass.bmp رو تو آرایه لود کنه.کد:#include <windows.h>
//#include "stdafx.h"
#include <gl/glut.h>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
GLuint texture;
void fill_texture(BYTE* data, int width, int height)
{
for (int i = 0; i < height; i++)
for (int j = 0; j < width; j++)
{
data[i * width * 3 + j * 3 + 0] = i % 256;
data[i * width * 3 + j * 3 + 1] = j % 256;
data[i * width * 3 + j * 3 + 2] = 127;
}
}
GLuint create_texture()
{
int width, height;
BYTE * data;
GLuint texture;
width = 256;
height = 256;
data = new BYTE[ width * height * 3 ];
fill_texture(data, width, height);
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data );
delete[] data;
return texture;
}
void Init (void)
{
glEnable( GL_TEXTURE_2D );
texture = create_texture();
glClearColor (1.0 , 1.0 , 1.0 , 0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D ( 0.0 , 300.0 , 0.0, 300.0);
}
void draw (void)
{
glBindTexture( GL_TEXTURE_2D, texture );
glClear(GL_COLOR_BUFFER_BIT);
glBegin( GL_TRIANGLES );
glTexCoord2d(0.0,0.0);
glVertex2d(150 , 225);
glTexCoord2d(1.0,0.0);
glVertex2d(75 , 75);
glTexCoord2d(1.0,1.0);
glVertex2d(225 , 75);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit (&argc , argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (100 , 100);
glutInitWindowSize (300 , 300);
glutCreateWindow ("Shape");
Init ();
glutDisplayFunc (draw);
glutMainLoop ();
return EXIT_SUCCESS;
}
کدشم C++ هست که می تونید تبدیل کنید...