2013-02-21 2 views
3

두 개의 이미지가 있고 둘 다 24 색 .bmp 32x32 픽셀입니다. OpenGL과 함께로드하면 OpenGL로 다른 하나를로드하면 흑백 라인 만 표시됩니다.OpenGL에서로드 한 이미지가 올바르게 표시되지 않는 이유는 무엇입니까?

다른 내용이있을 수 있으므로 이미지 중 하나를 표시하지 않을 수 있습니까?

이 하나의 코드에서 작동하지 않습니다

grass1.bmp http://turboimg.com/p/aur1361433642q.bmp

이 하나의 코드에서 작업을 수행합니다

grass.bmp http://turboimg.com/p/udj1361433715c.bmp

는 또한 정보의 크기와 파일 헤더 크기를 확인했습니다. 두 이미지는 모두 정보가 40이고 파일 크기가 14입니다. biWidth와 BiHeight 이미지는 여전히 32x32입니다.

grass := Readbitmap('Grass.bmp',sGrass,tGrass); 

그리고 이미지 데이터를 얻는 방법 (해야한다 :

나는 이미지 잔디

//GRASS 
glTexImage2d(GL_TEXTURE_2D,Level,Colorcomps,sGrass,tGrass,Border,GL_RGB,GL_UNSIGNED_BYTE,grass); 
glLoadName(1); 
glBegin(GL_POLYGON); 
    for I := 0 to 6 do 
    begin 
     glTexCoord2f(COS(i/6.0*2*PI),SIN(i/6.0*2*pi)); 
     glVertex3f((((COS(i/6.0*2*PI)/12)+offsetx)+0.2),((SIN(i/6.0*2*pi)/12)+offsety),-2); 
    end; 
glEnd; 

grass와 진수 질감 방법이 보여줍니다 포인터 등 같은 채워져 다른 이미지와 함께 작동하는 것처럼 확인해도 좋습니다. 두 이미지를 다르게 만들 것이라고 생각합니다.)

Function TFCreateMap.ReadBitmap(const FilePath:String;var sWidth,tHeight:GLsizei):pointer; 
const 
    szh=SizeOf(TBitmapFileHeader); 
    szi=SizeOf(TBitmapInfoHeader); 
var 
    bmpfile: file; 
    bfh:TBitmapFileHeader; 
    bmi:TBitmapInfoHeader; 
    t:byte; 
    x, 
    fpos, 
    size: integer; 
begin 
    assignfile(bmpfile,FilePath); 
    reset(bmpfile,1); 
    size := FileSize(bmpfile)-szh-szi; 
    blockread(bmpfile,bfh,szh); 
    if bfh.bfType<>$4D42 then 
    raise EinvalidGraphic.Create('Invalid Bitmap'); 
    blockread(bmpfile,bmi,szi); 
    with bmi do 
    begin 
    sWidth := biWidth; 
    tHeight := biHeight; 
    end; 
    getmem(result,size); 
    blockread(bmpfile,result^,size); 
    for x := 0 to sWidth*tHeight-1 do 
    with TWrap(result^)[x] do 
    begin 
    t := r; 
    r := b; 
    b := t; 
    end; 
end; 
+0

그것은 힘들지만, 예를 점검하기위한 시도 : 그래서 내 생각 엔 당신이 색상 채널의 회전을두고 format 매개 변수의 GL_BGR 값으로 glTexImage2D 함수를 호출 할 수 있다는 것입니다 'TBitmapInfoHeader' 구조체의'biHeight' 값. 이것은 음수 값일 수 있으며 해당 값을 전달하는 함수는 음수 값을 가져 가지 않을 수 있습니다. 그러나 그 이미지를 모르고서 당신이 그'ReadBitmap' 메소드로 당신이하고있는 것을 보여주지 않았기 때문에 그것은 단지 추측입니다. – TLama

+0

나는 가치관에 차이가 있는지를 시험하고 보게 될 것이다. 나에게 몇 분을 준다. 그러나 ReadBitmap을 사용하면 데이터를 opengl에 보내기 전에 infoheader와 파일 헤더를 제거하는 것만으로 충분합니다. 데이터를 "잔디"라는 포인터에 저장합니다. 그것은 어디에서 최대 사용됩니다. 사진에 대한 링크를 제공 할 수는 있지만 어떤 방식 으로든 사진 사이트에 업로드하면 확실하지는 않습니다. 그러나 몇 분 안에 둘 다 할 것입니다. –

+0

이미지가있는 소식이 업데이트되었습니다. 헤더 정보/높이 정보 –

답변

4

비트 맵의 ​​비트 수는 최소한 다릅니다. 로드에 실패한 것은 8 비트이고 작업중인 비트는 24 비트입니다. 필요한 것은 8 비트 비트 맵을 24 비트로 변환하는 것입니다 (glTexImage2D 함수 호출의 format 매개 변수 값 때문에).

코드 검토 :

나는 코드의 검토를 만들어 여기에 결과의 한; 다음 코드는 파일을 읽기 위해 파일 스트림을 사용합니다 (이전 스타일 I/O 루틴의 팬이 아니므로 파일 닫기를 잊어 버렸습니다). @rove가 잘못 지적한 것처럼 색상 채널 회전 부분을 제거합니다. 아래 언급 된 이유로). 이유에 지금

function TFCreateMap.ReadBitmap(const AFilePath: string; var AWidth, 
    AHeight: GLsizei): Pointer; 
var 
    DataSize: Integer; 
    FileStream: TFileStream; 
    FileHeader: TBitmapFileHeader; 
    InfoHeader: TBitmapInfoHeader; 
const 
    FileTypeBitmap = $4D42; 
    FileHeaderSize = SizeOf(TBitmapFileHeader); 
    InfoHeaderSize = SizeOf(TBitmapInfoHeader); 
begin 
    Result := nil;        

    FileStream := TFileStream.Create(AFilePath, fmOpenRead); 
    try 
    FileStream.ReadBuffer(FileHeader, FileHeaderSize); 
    if (FileHeader.bfType <> FileTypeBitmap) then 
     raise EinvalidGraphic.Create('Invalid file type!'); 

    FileStream.ReadBuffer(InfoHeader, InfoHeaderSize); 
    if (InfoHeader.biBitCount <> 24) then 
     raise EinvalidGraphic.Create('Invalid bit depth!'); 

    DataSize := FileStream.Size - FileHeaderSize - InfoHeaderSize; 
    GetMem(Result, DataSize); 
    FileStream.ReadBuffer(Result^, DataSize); 

    AWidth := InfoHeader.biWidth; 
    AHeight := InfoHeader.biHeight;  
    finally 
    FileStream.Free; 
    end;  
end; 

, 나는 색상을 제거하는 이유 : 나는 (당신이 glTexImage2D 함수 호출에 사용하는 format 플래그 24 비트이어야 함) 필요한 비트 깊이 값에 대한 검사를 추가했습니다 채널 회전; OpenGL에 대한 경험이 거의 없지만, 매개 변수에 대한 BGR 픽셀 배열을 기대한다고 말하면서 glTexImage2D 함수의 format 매개 변수 값이이 부분을 단순화 할 수 있다는 점을 알 수 있습니다. 비트 맵이 저장됩니다.우리가 그들을이없는 경우 해당 이미지를 비교하는

glTexImage2D(GL_TEXTURE_2D, Level, Colorcomps, sGrass, tGrass, Border, GL_BGR, 
    GL_UNSIGNED_BYTE, grass); 
... 
+0

[대체 방법] (http://forum.vingrad.ru/forum/s/4ad5ff79dd9daa2d80afdfe69ef94a99/topic-263976.html)을보고 간단한 테스트를 실행 한 결과 기대 한 바를 확인할 수 있습니다. 색상 채널 회전을 제거하고 단순히'format' 매개 변수에'GL_BGR' 값을 사용할 수 있습니다. – TLama

+0

네, 색상을 조정하는 것이 었습니다. 내가 BGR로 저장 한 RGB에서 OpenGL을 읽음을 읽었습니다. OpenGL에서 GL_BGR에 대한 옵션을 보지 못했지만 그곳에는 다행입니다. D. Thansk alot –

+0

당신을 환영합니다! – TLama

2

첫 번째 이미지에는 색인 색상 형식이 있지만 두 번째 이미지에는 RGB가 있습니다. 김프 또는 다른 편집기를 사용하여 색상 형식을 변경할 수 있습니다.

관련 문제