Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2008, 20:20   #1
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию OpenGL: проблема с цветом

Доброго времени суток, такая проблема:
Программа средствами OpenGL должна вывести на экран *.bmp изображение, она его выводит, ну вот цвета становятся другими (оранжевый-синим белый-чёрным) как это исправить? Или это я где-то сглупил.. Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL;

type
  NColor=record //Запись для перевода цвета
   R:real;//красный
   G:real;//зеленый
   B:real;//синий
    end;
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    dc:hdc;
    hrc:hglrc;
    procedure pxformat;
    function ConvertColor(color:tcolor):NColor;//Конвертирование цветов
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  dc:=getdc(handle);
  pxformat;
  hrc:=wglcreatecontext(dc);
  wglmakecurrent(dc, hrc);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  WGLMAKECURRENT(0,0);
  wgldeletecontext(hrc);
  releasedc(handle, dc);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  formpaint(nil);
end;

procedure TForm1.pxformat;
var
  npixelformat:integer;
  pfd:tpixelformatdescriptor;
begin
  fillchar(pfd, sizeof(pfd), 0);
  pfd.nSize:=sizeof(pfd);
  pfd.nVersion:=1;
  pfd.dwFlags:=pfd_doublebuffer+pfd_support_opengl+pfd_draw_to_window;
  pfd.iPixelType:=pfd_type_rgba;
  pfd.cColorBits:=128;
  pfd.cAlphaBits:=128;
  pfd.cAccumBits:=128;
  pfd.cDepthBits:=128;
  pfd.cStencilBits:=128;
  pfd.iLayerType:=pfd_main_plane;
  npixelformat:=choosepixelformat(dc, @pfd);
 if npixelformat<>0 then
  setpixelformat(dc, npixelformat, @pfd);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  ps:tpaintstruct;
  Pic:TBitmap;
  w, h:integer;
  NC:NColor;
begin
  glmatrixmode(gl_projection);
  glloadidentity();
 if width <= height then
  glortho (-2, 2, -2*height/width, 2*height/width, -10.0, 10.0)
 else
  glortho (-2*height/width, 2*height/width, -2, 2, -10.0, 10.0);
  glviewport(0, 0, width, height);


  beginpaint(handle, ps);
  glclearcolor(1, 1, 1, 1);
  glclear(gl_color_buffer_bit or gl_depth_buffer_bit);
  glpushmatrix;
  glenable(gl_point_smooth);

  glpointsize(1);
  Pic:=TBitMap.Create;
  Pic.LoadFromFile('E:\1.BMP');

  glBegin(gl_points);
  
  for w:=1 to pic.Width do
   begin
     for h:=1 to pic.Height do
      begin
           NC:=ConvertColor(Pic.Canvas.Pixels[W, H]);//Получаем цвет
           glColor3f(NC.R, NC.G, NC.B);//Выбираем его
           glVertex3f(0.001*W+0.25, 0.001*H+-0.25, 0);//Рисуем
      end;
   end;

  glend;
  Pic.Free;

  gldisable(gl_point_smooth);
  glflush();
  swapbuffers(dc);
  endpaint(handle, ps);
end;

function TForm1.ConvertColor(color: tcolor): NColor;
var
  i:LongInt;
begin
  i:=ColorToRGB(color);
  Result.R:=1/GetRValue(i);
  Result.G:=1/GetGValue(i);
  Result.B:=1/GetBValue(i);
end;

end.
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 18.06.2008, 21:26   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

ConvertColor у тебя неправильная.
Попробуй так Result.R:=GetRValue(color); и т.д.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 18.06.2008, 21:55   #3
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Цитата:
ConvertColor у тебя неправильная.
Попробуй так Result.R:=GetRValue(color); и т.д.
Не идёт, у Canvas цвета от 1 до 255, а у OpenGL от 0.0 до 1.0, вот и получится что все цвета будут либо белыми либо чёрными...
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 10.01.2010, 15:07   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
R:=(Color and $FF)/255;
G:=((Color and $FF00) shr 8)/255;
B:=((Color and $FF0000) shr 16)/255;
Color - цвет текущего пикселя, R,G,B - компоненты цвета в формате OpenGL (от 0 до 1)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.01.2010, 15:11   #5
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

В OpenGL есть функция glColor3ub, принимающая целочисленные однобайтовые значения
maxionans вне форума Ответить с цитированием
Старый 10.01.2010, 15:14   #6
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Кстати, ошибка здесь

Цитата:
Сообщение от N!ckeL Посмотреть сообщение
Код:
function TForm1.ConvertColor(color: tcolor): NColor;
var
  i:LongInt;
begin
  i:=ColorToRGB(color);
  Result.R:=1/GetRValue(i);
  Result.G:=1/GetGValue(i);
  Result.B:=1/GetBValue(i);
end;
Нужно вот так:
Код:
function TForm1.ConvertColor(color: tcolor): NColor;
var
  i:LongInt;
begin
  i:=ColorToRGB(color);
  Result.R:= GetRValue(i) / 255;
  Result.G:= GetGValue(i) / 255;
  Result.B:= GetBValue(i) / 255;
end;
maxionans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Включение функции выделение цветом xxdima Microsoft Office Excel 3 28.08.2008 23:47
выделение строк цветом в StringGrid kate158 Помощь студентам 1 06.08.2008 09:56
хочу закрасить розовым цветом(си) Барби Помощь студентам 1 25.05.2008 13:58
Функции управления цветом символа BC++3.1 Go6a Помощь студентам 6 02.04.2008 21:16
TListView; не рисует цветом TCanvas JetAPI Компоненты Delphi 9 24.08.2007 22:22