Okay erst mal vielen Dank für die ganzen Hinweise. Ich habe versucht alle eure Tipps zu berücksichtigen und habe den Code geändert.
Shader:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
uniform sampler2D world;
void main (void)
{
vec2 cellPos;
vec2 cellTexPos;
vec4 cellColor;
cellPos.x=floor(gl_FragCoord.x/8.0);
cellPos.y=floor(gl_FragCoord.y/8.0);
cellTexPos.x=floor(cellPos.x*8.0)*(1.0/80.0);
cellTexPos.y=floor(cellPos.y*8.0)*(1.0/60.0);
cellColor=texture2D(world,cellTexPos);
if ((floor(cellPos.x*8.0)==floor(gl_FragCoord.x))||
(floor(cellPos.y*8.0)==floor(gl_FragCoord.y)))
gl_FragColor=vec4(1.0,1.0,1.0,1.0);
else
gl_FragColor=cellColor;
}
|
Einbinden mit C++:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
worldTexID=gfx->CreateTexture(80,60).id;
int texIDVar=glGetUniformLocation(renderShader.program,"world");
gfx->UseShader(renderShader);
glUniform1ui(texIDVar, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, worldTexID);
glActiveTexture(GL_TEXTURE0);
gfx->StopShader();
|
Zusätzlich hab ich gemerkt dass wenn man die gewünschte Umrandung weiß zeichnen lässt das auch so funktioniert wie es soll. Außerdem sind 160*120 Kästchen viel zu klein deswegen hab ich dies runtergesetzt auf 80*60.
Ein Vertexshader gibt es auch allerdings besteht der nur aus
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
void main()
{
gl_Position=ftransform();
}
|
da ich nur 4 Vertices zeichnen lasse.
Ich musste die Textur "worldTexID" auf GL_TEXTURE1 schalten da ich zum zeichnen in C++ lediglich ein weißes Rechteck zeichnen lasse und die eigentliche Arbeit dem Shader überlasse:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//Render
gfx->UseShader(renderShader);
glBindTexture(GL_TEXTURE_2D,0);
glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
glVertex2f(0.0f,0.0f);
glVertex2f(640.0f,0.0f);
glVertex2f(640.0f,480.0f);
glVertex2f(0.0f,480.0f);
glEnd();
gfx->StopShader();
|
Eine weitere vielleicht nützliche Information wäre, dass ich das in einen Framebuffer zeichnen lasse um die Rechenarbeit nicht jedes machen lassen muss.
EDIT: es stellte sich heraus dass die berechneten textur koordinaten richtig sind. Mit einem Zusatz konnte ich genau die Kästchen grün färben die bestimmte textur koordinaten haben müssten und diese auch haben:
|
C-/C++-Quelltext
|
1
2
3
|
else if (cellTexPos.x>0.0125&&cellTexPos.x<0.0625&&
cellTexPos.y>0.0166667&&cellTexPos.y<0.083333)
gl_FragColor=vec4(0.0,1.0,0.0,1.0);
|