Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.08.2010, 15:22

Problem mit einem Frame-Buffer

Hallo.
Ich programmiere gerade an einem Projekt mit OpenGL. da verwende ich einen eindimensionalen Framebuffer, aus dem ich dann eine Textur erstelle.

Allerdings hab ich so meine Probleme mit einem eindimensionalen Buffer, wenn ich nur auf spezielle Pixelwerte zugreifen will..

könnte mir da jemand ein paar gute links schicken, wo sowas erklärt is oder erklärt mir das jemand?

wäre sehr nett.

achja... vielleicht hab ich die falschen begriffe verwendet, aber bei google fand ich nix

lg aly

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

26.08.2010, 16:48

Erklär mal etwas genauer was du machst und wo eigentlich dein Problem liegt. Was ist ein "eindimensionaler Framebuffer" (soll das heißen du verwendest glFramebufferTexture1D)?

3

27.08.2010, 08:31

ok... sry, wenns unklar war.
ich hab einfach ein eindimensionales array von unsigned ints, und aus diesem array will ich mir dann meine textur bauen.
jetzt hab ich das problem, dass ich nicht alle pixel aus dem buffer haben will in der textur, sondern nur einen teil...

und da tu ich mich jetzt mächtig schwer auf die richtige stelle zuzugreifen...
weil ich in 2 for schleifen ein nur 1D array durchlauf...

auf gut deutsch: ich hab ein bild und will einen kleinen ausschnitt davon wo anders als textur auf ein quad legen...

lg

4

27.08.2010, 09:20

Okay,

also angenommen deine textur hat Ausmaße von 320x200.
Du definierste einen Ausschnitt, bspw. 20x30 pixel, ab Position Ps(30,20).
Dein Array ist also 320x200x3 (RGB) groß.

Die Startposition in dem Array kannst du errechnen:
Offset = Ps.y*320 + Ps.x

Joar, und dann gehst du Zeile für Zeile durch das Array, also soetwas wie:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
for(int xPos(Ps.x); xPos<20; ++xPos)
  for(int yPos(Ps.y); yPos<30; ++yPos) 
  { 
     pos =  ( (yPos)*320 + (xPos) )*3;
    newTexPos = ( (yPos-Ps.y)*newTexHeight + (xPos-Ps.x)  )*3;
    newTexArray[newTexPos ] = array[pos];
    newTexArray[newTexPos +1] = array[pos+1];
    newTexArray[newTexPos +2] = array[pos+2];
  }


So, ich hoffe ich hab alles beachtet und nicht irgendwelchen Scheiss geschrieben... :whistling:
Aber ich weiß nicht, ob es auch eine OpenGL-Funktion dazu gibt.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

27.08.2010, 09:20

Wie willst du die unsigned ints den in eine Textur bringen? Bzw. was für ein Format hat dein Framebuffer den?
jetzt hab ich das problem, dass ich nicht alle pixel aus dem buffer haben will in der textur, sondern nur einen teil...

Verstehe ich nicht ganz. Heißt das jetzt, dass du nicht weißt wie du dein Pixel Array durchgehst? Normalerweise ergibt sich der Index aus y*Breite + x; aber das kommt eben drauf an, wie das Array angelegt wurde.

6

27.08.2010, 09:34

naja ich hab da eh schon eine idee gehabt, aber offenbar hat die nicht gestimmt.

also: ich hab ein hintergrund bild mit width und height. alle pixel dieses bildes hau ich in backBuffer. jedes pixel is rgba als unsigned int gespeichert... das is nicht das problem

dann hab ich den bild ausschnitt. der is 75x75 groß. also hab ich auch hier ein array: pixelBuffer.

C-/C++-Quelltext

1
2
3
4
5
6
7
for(int i = 0; i < 75; i++)
        {
            for(int j = 0; j < 75; j++)
            {
                pixelBuffer[i+j*75] = backBuffer[mouseX+i + (j+mouseY)*back_image->getWidth()];
            }
        }


mouseX,Y sind die mauskoords. ich will den ausschnitt nämlich von dort nehmen, wo die maus is...

aber so passt das nicht...ichbekomm nur rauschen...

aschja: die array sind so angelegt:

C-/C++-Quelltext

1
unsigned int *pixelBuffer = new unsigned int[width*height*sizeof(unsigned int)];

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.08.2010, 10:05

Erklär mir mal was genau du damit eigentlich machen willst. Ich hab nämlich den Eindruck dass du da grad etwas am Holzweg bist. Ich denke dass es in deinem Fall sinnvoller wäre das ganze Bild in eine Textur zu packen und dann über die Texturkoordinaten den entsprechenden Ausschnitt zu wählen...

8

27.08.2010, 10:06

Also, das Array sollte so ingelegt werde:

C-/C++-Quelltext

1
 unsigned int *pixelBuffer = new unsigned int[width*height*4];   //RGBA


dann in etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for(int i = 0; i < 75; i++)
          for(int j = 0; j < 75; j++)
  {
int pos =  ((j+mouseY)*back_image->getWidth()) + (mouseX+i))*4;
int posNew = j*75 + i
pixelBuffer[posNew ] = backBuffer[pos];
pixelBuffer[posNew +1] = backBuffer[pos + 1];
pixelBuffer[posNew +2] = backBuffer[pos + 2];
pixelBuffer[posNew +3] = backBuffer[pos + 3];
    }
        


Wenn ich das richtig verstanden habe!

9

27.08.2010, 11:10

@dot: ja vielleicht wärs wirklich einfacher, das ganze bild zu kopieren und das texturemapping anzupassen.

habs so probiert jogge, so hats auch nicht geklappt...
vielleicht liegt das problem wo anders...

naja... ich schau mal ob ichs andres zammbring

lg und danke für eure hilfe

10

27.08.2010, 11:14

Sorry, ist mir ein Fehler unterlaufen.
Es soll nich

C-/C++-Quelltext

1
int posNew = (j*75 + i);

sondern

C-/C++-Quelltext

1
int posNew = (j*75 + i)*4;

heißen!

Werbeanzeige