Прошу помощи.В программе с библиотеками OpenGL загружаются картинки PNG размером только 32 X 32.Если картинка больше,то не загружается.Какая часть кода отвечает за загрузку картинки любого размера???=-O
Добавлено через 28 минут
Язык, как вы заметили, не C++:D
:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using Tao.DevIl;// ТЕКСТУРЫ
using Tao.FreeGlut; // для работы с библиотекой FreeGLUT
using Tao.OpenGl; // для работы с библиотекой OpenGL
using Tao.Platform.Windows;// для работы с элементом управления SimpleOpenGLControl
using System.Windows.Forms;
//using OpenTK;
namespace OpenGl_InFramework
{
public partial class Form1 : Form
{
Timer RenderTimer;
// ряд вспомогательных переменных
// поворот
private int rot = 0;
// флаг - загружена ли текстура
private bool textureIsLoad = false;
// имя текстуры
public string texture_name = "";
// идентификатор текстуры
public int imageId = 0;
// текстурный объект
public uint mGlTextureObject = 0;
public Form1()
{
InitializeComponent();
siOGlC.InitializeContexts();// инициализация элемента siOGlC(simpleOpenGlControl)
RenderTimer = new Timer();
RenderTimer.Interval = 30;
RenderTimer.Tick += new EventHandler(UpDate);
}
private void UpDate(object sender, EventArgs e)
{
// вызов функции отрисовки сцены
Draw();
}
private void simpleOpenGlControl1_Load(object sender, EventArgs e)
{
//enabled = false;
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация библиотеки glut
Glut.glutInit();
// инициализация режима экрана
Glut.glutInitDisplayMode( Glut.GLUT_RGB | Glut.GLUT_DOUBLE);
// инициализация библиотеки openIL
Il.ilInit(); Il.ilEnable( Il.IL_ORIGIN_SET);
// установка цвета очистки экрана (RGBA)
Gl.glClearColor(0.0f,0.0f,0.0f,0.0f);
// установка порта вывода
Gl.glViewport(0,0, siOGlC.Width, siOGlC.Height);
//Gl.glViewport(0,100, siOGlC.Width, siOGlC.Height);
// активация проекционной матрицы
Gl.glMatrixMode( Gl.GL_PROJECTION);
// очистка матрицы
Gl.glLoadIdentity();
// установка перспективы
Glu.gluPerspective(30, siOGlC.Width / siOGlC.Height, 1, 100);
//Glu.gluPerspective(20.0f, siOGlC.Width / siOGlC.Height, 1, 100);
// установка объектно-видовой матрицы
Gl.glMatrixMode( Gl.GL_MODELVIEW); Gl.glLoadIdentity();
// начальные настройки OpenGL
Gl.glEnable( Gl.GL_DEPTH_TEST); Gl.glEnable( Gl.GL_LIGHTING);
Gl.glEnable( Gl.GL_LIGHT0);
// активация таймера
// RenderTimer.Start();
}
private void button1_Click(object sender, EventArgs e)
{
RenderTimer.Start();
}
private void button2_Click(object sender, EventArgs e)
{
RenderTimer.Stop();
}
private void timer1_Tick(object sender, EventArgs e)
{
// вызов функции отрисовки сцены
// Draw();
}
private void siOGlC_Paint(object sender, PaintEventArgs e)
{
}
private void eXITToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void iMAGEToolStripMenuItem_Click(object sender, EventArgs e)
{ // открываем окно выбора файла
DialogResult res = openFileDialog1.ShowDialog();
// если файл выбран - и возвращен результат OK
if (res == DialogResult.OK)
{ // создаем изображение с идентификатором imageId
Il.ilGenImages(1, out imageId);
// делаем изображение текущим
Il.ilBindImage(imageId);
// адрес изображения полученный с помощью окна выбора файла
string url = openFileDialog1.FileName;
// пробуем загрузить изображение
if ( Il.ilLoadImage(url))
{ // если загрузка прошла успешно
// сохраняем размеры изображения
int width = Il.ilGetInteger( Il.IL_IMAGE_WIDTH);
int height = Il.ilGetInteger( Il.IL_IMAGE_HEIGHT);
//int width = 300;
//int height = 100;
// определяем число бит на пиксель
int bitspp = Il.ilGetInteger( Il.IL_IMAGE_BITS_PER_PIXEL);
// int bitspp = Il.ilGetInteger(Il.IL_IMAGE_BYTES_PER_PIXEL);
// int bitspp = Il.ilGetInteger(Il.IL_IMAGE_BPC);
switch (bitspp)
// в зависимости от полученного результата
{ // создаем текстуру, используя режим GL_RGB или GL_RGBA
case 24: mGlTextureObject = MakeGlTexture( Gl.GL_RGB, Il.ilGetData(), width, height); break ;
case 32: mGlTextureObject = MakeGlTexture( Gl.GL_RGBA, Il.ilGetData(), width, height); break ; }
// case 100 : mGlTextureObject = MakeGlTexture( Gl.GL_RGBA, Il.ilGetData(), width, height); break ; }
// активируем флаг, сигнализирующий загрузку текстуры
textureIsLoad = true ;
// очищаем память
Il.ilDeleteImages(1, ref imageId);
}
}
}
// создание текстуры в памяти openGL
private static uint MakeGlTexture( int Format, IntPtr pixels, int w, int h)
{
// идентификатор текстурного объекта
uint texObject;
// генерируем текстурный объект
Gl.glGenTextures(1, out texObject);
// устанавливаем режим упаковки пикселей
Gl.glPixelStorei( Gl.GL_UNPACK_ALIGNMENT, 1);
// создаем привязку к только что созданной текстуре
Gl.glBindTexture( Gl.GL_TEXTURE_2D, texObject);
// устанавливаем режим фильтрации и повторения текстуры
Gl.glTexParameteri( Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
Gl.glTexParameteri( Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
Gl.glTexParameteri( Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri( Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexEnvf( Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_REPLACE);
// создаем RGB или RGBA текстуру
switch (Format)
{
case Gl.GL_RGB: Gl.glTexImage2D( Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, w, h, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, pixels); break;
case Gl.GL_RGBA: Gl.glTexImage2D( Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, w, h, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, pixels); break;
} // возвращаем идентификатор текстурного объекта
return texObject;
}
// функция отрисовки
private void Draw()
{
// если текстура загружена
if (textureIsLoad) {
// увеличиваем угол поворота
rot++;
// корректируем угол
if (rot > 360) rot = 0;
// очистка буфера цвета и буфера глубины
Gl.glClear( Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glClearColor(-1.0f,0.0f,0.0f,1.0f);
// очищение текущей матрицы
Gl.glLoadIdentity(); // включаем режим текстурирования
Gl.glEnable( Gl.GL_TEXTURE_2D);
// включаем режим текстурирования, указывая идентификатор mGlTextureObject
Gl.glBindTexture( Gl.GL_TEXTURE_2D, mGlTextureObject);
// сохраняем состояние матрицы
Gl.glPushMatrix();
// выполняем перемещение для более наглядного представления сцены
Gl.glTranslated(0, -1, -5);
// реализуем поворот объекта
Gl.glRotated(rot, 0, 1, 0);
// отрисовываем полигон
Gl.glBegin( Gl.GL_QUADS);
// указываем поочередно вершины и текстурные координаты
Gl.glVertex3d(1, 1, 0); Gl.glTexCoord2f(0, 0); Gl.glVertex3d(1, 0, 0);
Gl.glTexCoord2f(1, 0); Gl.glVertex3d(0, 0, 0); Gl.glTexCoord2f(1, 1);
Gl.glVertex3d(0, 1, 0); Gl.glTexCoord2f(0, 1);
// завершаем отрисовку
Gl.glEnd();
// возвращаем матрицу
Gl.glPopMatrix();
// отключаем режим текстурирования
Gl.glDisable( Gl.GL_TEXTURE_2D);
// обновляем элемент со сценой
siOGlC.Invalidate();
}
}
//Подробнее на esate.ru:
}
}
Язык, как вы заметили, не C++:D