Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Kyroaku

Strony: 1 ... 12 13 14 15 [16]
226
Szkółka / Odp: Android OpenGL 2.0
« dnia: Marzec 08, 2014, 01:28:00 »
Ok, jednak program wciąż działa bardzo wolno. Problem leży zapewne w środku pętli for(), ale nie wiem dlaczego. Przecież nic skomplikowanego w niej nie ma (chyba)

227
Szkółka / Odp: Android OpenGL 2.0
« dnia: Marzec 07, 2014, 13:02:58 »
Uporalem się z perspektywa i innymi problemami wizualnymi, ale teraz mam problem ze sprawnością ;)
Mam krotki shader dla najprostszych świateł (ambient + diffuse), ale przy 2 światłach cala aplikacja chodzi zbyt wolno, aby dało się w nią grac... Po pierwsze chciałbym się dowiedzieć, czego nie powinienem robić we fragment shaderze, a czego w vertex shaderze, czego unikać itd, itp.

Vertex Shader:
uniform mat4 u_ModelMatrix;
uniform mat4 u_ViewMatrix;
uniform mat4 u_ProjectionMatrix;
uniform mat4 u_NormalMatrix;

attribute vec4 a_Vertex;
attribute vec4 a_Normal;
attribute vec2 a_Texcoord;
attribute vec4 a_Color;

varying vec4 v_Vertex;
varying vec4 v_Normal;
varying vec4 v_Color;
varying mat4 v_ViewMatrix;

void main()
{
v_Vertex = a_Vertex * u_ModelMatrix * u_ViewMatrix;
v_Normal = normalize( u_NormalMatrix * a_Normal );
v_Color = a_Color;
v_ViewMatrix = u_ViewMatrix;
gl_Position = a_Vertex * u_ModelMatrix * u_ViewMatrix * u_ProjectionMatrix;
}

Fragment shader:
precision lowp float;

struct Light
{
vec4 ambient, diffuse, specular;
vec4 position;
};
uniform Light lights[8];
uniform int lightsNum;

varying vec4 v_Vertex;
varying vec4 v_Normal;
varying vec4 v_Color;
varying mat4 v_ViewMatrix;

void main()
{
vec4 outColor = v_Color;
for(int i=0; i<lightsNum; i++)
{
vec4 lightDir = normalize( lights[i].position * v_ViewMatrix - v_Vertex );
float diffuseTerm = clamp( dot(v_Normal, lightDir), 0.0, 1.0);
outColor = lights[i].ambient*outColor + lights[i].diffuse*outColor*diffuseTerm;
}
gl_FragColor = outColor;
}

228
Szkółka / Odp: Android OpenGL 2.0
« dnia: Marzec 01, 2014, 19:02:21 »
Dlaczego obcina mi wierzcholki przy POS.z < -1.0 ?
W macierzy projekcji mam ustawione near=1.0, far=10.0. Na androidzie ustawia się ten depth rangę inaczej ?

229
Projekty rozpoczęte / Odp: PURB
« dnia: Luty 25, 2014, 00:12:17 »
Po samej grafice i opisie stwierdzam, ze mi się podoba... Chociaż normalnie w tego typu gry nie gram, te wyprobuje.

230
Szkółka / Odp: Android OpenGL 2.0
« dnia: Luty 25, 2014, 00:00:25 »
Wiem juz, ze problem leży w macierzy matModel[16], ale wciąż nie wiem dlaczego.
Poprawilem oczywiście błędy, które zauwzyles.

231
Szkółka / Android OpenGL 2.0
« dnia: Luty 24, 2014, 16:12:11 »
Witam,
Pisze pod androida w OpenGL 2.0 i mam pewien problem.
Mam 2 macierze, które sa odpowiedzialne za przekształcenia wierzchołków:
matModel[16] oraz matProjection[16]
Do ustawiania tych macierzy uzywam klasy Matrix.
Przekazuje je do shadera z każdym wywołaniem metody "rysujacej" model.
Generalnie wszystko wydaje się być dobrze, dopóki nie obracam scena. Mam wrażenie, ze źle jest ustawiona macierz projekcji, ale jeszcze nie rozumiem dlaczego.
public void onSurfaceChanged(GL10 p1, int w, int h)
{
GLES20.glViewport(0, 0, w, h);
float ratio = (float)w/(float)h;
ss.setFrustum(-1.0f*ratio, 1.0f*ratio, -1.0f, 1.0f, 1.0f, 1000.0f);
//ss.setPerspective(45.0f, ratio, 1.0f, 1000.0f);
}
public void onDrawFrame(GL10 p1)
{
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

objQuad.identity();
//objQuad.translate(0.0f, 0.0f, -2.0f);
objQuad.rotate(rot.y, 0.0f, 1.0f, 0.0f);
objQuad.rotate(rot.x, 1.0f, 0.0f, 0.0f);

objQuad.rotate(0.0f, 0.0f, 0.0f, 1.0f);
objQuad.draw(shader);

objQuad.rotate(90.0f, 0.0f, 0.0f, 1.0f);
objQuad.draw(shader);

objQuad.rotate(90.0f, 0.0f, 0.0f, 1.0f);
objQuad.draw(shader);

objQuad.rotate(90.0f, 0.0f, 0.0f, 1.0f);
objQuad.draw(shader);
}
Metoda rotate () tak, jak inne metody operujące na macierzach, wygląda tak:
public void rotate(float a, float x, float y, float z) {
float Matt[] = new float[16];
Matrix.setIdentityM(matT, 0);
Matrix.rotateM(matT, 0, a, x, y, z);
Matrix.multiplyMM(matModel, 0, matT, 0, matModel, 0);
}
uniform mat4 u_ModelMatrix;
uniform mat4 u_ViewMatrix;
uniform mat4 u_ProjectionMatrix;
uniform mat4 u_mvpMatrix;

attribute vec4 a_Vertex;
attribute vec3 a_Normal;
attribute vec2 a_Texcoord;
attribute vec4 a_Color;

varying vec4 v_Vertex;

void main()
{
v_Vertex = a_Vertex;
gl_Position = a_Vertex * u_mvpMatrix;
}
Najbardziej dziwi mnie to, ze jest różnica miedzy zapisem:
gl_Position = u_mvpMatrix * a_Vertex;A
gl_Position = a_Vertex * u_mvpMatrix;W pierwszym przypadku wszystko wygląda w ogóle inaczej, niż powinno. W drugim zas wygląda dobrze, ale tylko przy nieruchomej scenie.
ObjQuad to zwykły prostokąt na płaszczyźnie XZ.
Z gory dziękuje za każda odpowiedz,

Strony: 1 ... 12 13 14 15 [16]