39
©SIProp Project, 2006-2008 1 How to Use OpenGL/ES on Native Activity Noritsuna Imamura [email protected]

How to Use OpenGL/ES on Native Activity

Embed Size (px)

DESCRIPTION

What’s OpenGL? Kind of OpenGL Vertions Hello 3D World World Polygon Projection Lighting Texture Hands on Use OpenGL/ES 2.0 Shader Programming

Citation preview

Page 1: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 1

How to Use OpenGL/ES on Native Activity

Noritsuna Imamura

[email protected]

Page 2: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 2

Agenda

What’s OpenGL?

Kind of OpenGL

Vertions

Hello 3D World

World

Polygon

Projection

Lighting

Texture

Hands on

Use OpenGL/ES 2.0Shader Programming

Page 3: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 3

What’s OpenGL?

OpenGL is 3D Graphic API.

Made by SGI

Since: 1992

Current Version: 4.4

Architecture: PIPE Line Process

Page 4: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 4

What’s OpenGL/ES?

OpenGL is 3D Graphic API for Embedded.

Subset from OpenGL

Since: 2003

Current Version: 3.0

Android Version Android API Level

OpenGL/ES

1.0(Apple Pie) 1 1.0, 1.1

2.2(Froyo) 8 2.0

4.3(JerryBeans) 18 3.0

Page 5: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 5

Bible of OpenGL/ES

OpenGL/ES 2.0 Programming Guide

http://www.amazon.com/dp/0321502795/

OpenGL/ES 3.0 Programming Guide

http://www.amazon.com/dp/0321933885/

Page 6: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 6

Function 1.0/1.1 2.0 3.0

Compatibility ー ー 2.0

Programmable Shader ー GLSL ES 1.0 GLSL ES 3.0

Transform Feedback ー ー Supported

Geometry glNormalglVertexPointerglNormalPointerglTexCordPointe

glVertexAttribPointer

glVertexAttribPointer

Matrix glMatrixModeglLoadIdentityglPushMatrix

ー ー

Lighting glLight/glMaterial ー ー

Fog glFog ー ー

Alpha Test glAlphaFunc ー ー

Point Stripe glTexEnv ー ー

User Clip glClipPlane ー ー

Logic Operation glLogicOp ー ー

FrameBuffer Object Option Supported SupportedMulti-Buffer

Page 7: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 7

Hello 3D World!!!

Page 8: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 8

What’s 3D World?

Frame of Reference

World

Model(Object)

Source Site: http://tech-sketch.jp/2011/10/3d1.html

Coordinates

Vertex

Index

Page 9: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 9

How to Draw Polygon?

TRIANGLE_STRIP

Joint 2 Points

TRIANGLES

Draw each Triangle

TRIANGLE_FAN

Joint 2 Points, but MUST use 1st Point

QUAD_STRIP

Joint 2 Points

QUAD

Draw each Square

POLYGON

Draw as Polygon

Page 10: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 10

How to Set in the World?

After Making Model, Set it to the World Frame.

Affine Transform

Page 11: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 11

Where is your Viewpoint(Viewport)?

Perspective Projection

zNearMinimum Viewpoint of Z-Axis

zFarMaximum Viewpoint of Z-Axis

fovyAngle of view of Y-Axis

aspectWidth/height of RealWindow

Page 12: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 12

Can you see them?

Z-Buffer

ON => Draw by Z-Axis

OFF => Draw by Sort of Drawing

Alpha Blending

ON => Color is Blended with Back Model

OFF => No See

Page 13: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 13

There is Dark…

Positional Light

Radiate in all directions

Directional Light

Parallel in all directions

Page 14: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 14

Bad Surface…

Put Texture Image to Model.

UV-Mapping (U-horizontal, V-vertical)Set Relation Between Texture Pixel and Model Vertex.

Page 15: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 15

How to Programing?

Use Fixed Function Pipeline in OpenGL/ES 1.1

glScale(x, y, z),

glRotate(Angle, x_moment, y_moment, z_moment)

glTranslate(x, y, z)

Page 16: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 16

How to Programing in 2.0or3.0?

Use Programmable Pipeline

VertexShader

FragmentShader

Page 17: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 17

Function 1.0/1.1 2.0 3.0

Compatibility ー ー 2.0

Programmable Shader ー GLSL ES 1.0 GLSL ES 3.0

Transform Feedback ー ー Supported

Geometry glNormalglVertexPointerglNormalPointerglTexCordPointe

glVertexAttribPointer

glVertexAttribPointer

Matrix glMatrixModeglLoadIdentityglPushMatrix

ー ー

Lighting glLight/glMaterial ー ー

Fog glFog ー ー

Alpha Test glAlphaFunc ー ー

Point Stripe glTexEnv ー ー

User Clip glClipPlane ー ー

Logic Operation glLogicOp ー ー

FrameBuffer Object Option Supported SupportedMulti-Buffer

Page 18: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 18

What’s Programmable Shader?

Shader(Renderer) that use GLSL (OpenGL Shading Language).

Vertex ShaderConvert Model Information to World Frame

Geometry Shader (Primitive Shader)Convert Primitive Data

Pixel Shader (Fragment Shader)Effect to Each Pixels

Ex. Fogging, Shadowing, …

Page 19: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 19

Hello 3D Programming World!!!

Page 20: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 20

Today’s Target

Page 21: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 21

Naming Rule of Functions

glXXX

OpenGL Func

eglXXX

OpenGL/ES Func

gluXXX

GUI Tools of Func

AGL, GLX, WGL

glutXXXGLUT Func

GLUT is GUI Tools of 3rd Party

yyXXXf

float

yyXXXd

double

yyXXXi

int

yyXXX2d

2D of Double

yyXXX3d

3D of Double

Page 22: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 22

Setting Files

AndroidManifest.xml

jni/Android.mk

1. <uses-feature android:glEsVersion="0x00020000"/>

1. LOCAL_LDLIBS += -lm -llog -lc -ldl -lz -landroid -lEGL -lGLESv2

Page 23: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 23

Init EGL World(System) 1/2

Configuration1. const EGLint attribs[] = {2. // Uset Open GL ES 2.03. EGL_RENDERABLE_TYPE,

EGL_OPENGL_ES2_BIT,4. // Set Surface Type as Double Buffer5. EGL_SURFACE_TYPE, EGL_WINDOW_BIT,6. // Minimum Frame Size of Blue7. EGL_BLUE_SIZE, 8,8. // Minimum Frame Size of Green9. EGL_GREEN_SIZE, 8,10. // Minimum Frame Size of Red11. EGL_RED_SIZE, 8,12. // Size of Depth Buffer13. EGL_DEPTH_SIZE, 16,14. // Terminator15. EGL_NONE16. };

Page 24: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 24

Init EGL World(System) 2/2

Init & Create

1. // Get EGL Display Connection2. EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);3. // Init Display4. eglInitialize(display, 0, 0);5. // Choose Frame Buffer List6. eglChooseConfig(display, attribs, &config, 1, &numConfigs);7. // Get Frame Buffer Setting8. eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);9. // Set Frame Buffer to NativeActivity10. ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);11. // Get Window Surface12. surface = eglCreateWindowSurface(display, config, engine->app->window,

NULL);13. // Get Rendering Context14. const EGLint attrib_list[] = { EGL_CONTEXT_CLIENT_VERSION, 2,

EGL_NONE };15. context = eglCreateContext(display, config, NULL, attrib_list);16. // Attach Rendering Context to Window Surface17. eglMakeCurrent(display, surface, surface, context);

Page 25: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 25

Init Cube Data

Create Programmable Shader!

glMyModel.cpp -> initCube()1. // Create Shader Program2. glProgram_Cube =

createProgram(gVertexShader_cube, gFragmentShader_cube);

3. // Bind Vertex to "Position" in VertexShaderProgram

4. glBindAttribLocation(glProgram_Cube, ATTRIB_VERTEX, "Position");

5. // Bind Color to "SourceColor" in VertexShaderProgram

6. glBindAttribLocation(glProgram_Cube, ATTRIB_COLOR, "SourceColor");

7. // Set program8. glUseProgram(glProgram_Cube);

Page 26: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 26

Setting of Programmable Shader

Write Shader Program using GLSL ES

Vertex Shader Source Code

1. // Vertex Shader Program2. static const char gVertexShader_cube[] =3. "attribute vec4 Position; \n"4. "attribute vec4 SourceColor; \n"5. "varying vec4 DestinationColor;\n"6. "uniform mat4 Projection; \n"7. "uniform mat4 Modelview; \n"8. "void main() {\n"9. " gl_Position = Projection * Modelview *

Position; \n"10. " DestinationColor = SourceColor; \n"11. "}\n";

Page 27: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 27

Setting of Programmable Shader

Fragment Shader Source Code

1. // FragmentShader of Color2. static const char gFragmentShader_cube[] =3. "varying lowp vec4 DestinationColor; \n"4. "void main() {\n"5. "gl_FragColor = DestinationColor;\n"6. "}\n";

Page 28: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 28

About GLSL: Type

Type Meaning

void Same in C Lang

bool Same in C++ Lang

int Same in C Lang

float Same in C Lang

vecX Vector Type

bvecX Logical Vector Type

ivecX Int Vector Type

matX Matrix Type

samplerXD Handler of Texture

sampleCube Handler of Cubic Texture

samplerXDShadow Handler of Depth Texture

http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.clean.pdf

Page 29: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 29

About GLSL: Value

Value Meaning

const Same in C Lang

uniform Global Value

in(Varying) Input Value

out(Varying) Output Value

inout(Varying) Input/Output Value

Page 30: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 30

About GLSL: Built-in Function

Function Name Meaning

radians() degrees to radians

degrees() radians to degrees

sin() Sine

cos() Cosine

tan() Tangent

texture() Set Texture

texture3D() Set 3D Texture

imageLoad() Load Image File

imageStore() Store Image File

Page 31: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 31

About GLSL: Built-in Value

Value Name Type Meaning

gl_Vertex vec4 Vertex Coordinates

gl_Normal vec3 Vertex Normal vector

gl_Color Vec4 Vertex Color

gl_ModelViewMatrix mat4 ModelView Matrix

gl_ProjectionMatrix mat4 Projection Matrix

gl_FrontColor Vec4 Front Color

gl_BackColor Vec4 Back Color

gl_TextCoord[] Vec4 Texture Coordinates

gl_Position Vec4 Vertex Position

gl_FragColor Vec4 Color Frag

gl_FlagDepth float Depth Frag

Page 32: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 32

Check createProgram() Func

glPGShaderTools.cpp

NOT built-in Function. Everyone write same way.

1. GLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {

2. GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);

3. if (!vertexShader)4. return 0;

5. GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);

6.

Page 33: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 33

Set Projection

glPGShaderTools.cpp -> prepareFrame()

getPerspective() is NOT built-in…

OpenGL/ES Version… All Built-in…

1. GLint projectionUniform = glGetUniformLocation(glProgram, "Projection");

2. mat4 projectionMatrix = getPerspective(45, (float) width / height, 0.5f, 500);

3. glUniformMatrix4fv(projectionUniform, 1, 0, projectionMatrix.Pointer());

1. glMatrixMode(GL_PROJECTON);2. glLoadIdentity();3. gluPerspective(45, (float)width / height, 0.5f, 500);

Page 34: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 34

Where is your Viewpoint(Viewport)?

Perspective Projection

zNearMinimum Viewpoint of Z-Axis

zFarMaximum Viewpoint of Z-Axis

fovyAngle of view of Y-Axis

aspectWidth/height of RealWindow

Page 35: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 35

Draw Cube! 1/2

glMyModels.cpp -> drawCube()

Check Matrix.hpp & Vertex.hppThey have “Affine Transform” Code…

Affine Transform Built-in Func is in OpenGL/ES 1.1…

1. // Pose for Cube2. mat4 rotationX = mat4::RotateX(engine->angleX);3. mat4 rotationY = mat4::RotateY(engine->angleY);4. mat4 rotationZ = mat4::RotateZ(engine->angleZ);5. mat4 scale = mat4::Scale(1.0);6. mat4 translation = mat4::Translate(0, 0, -10);7. mat4 modelviewMatrix = scale * rotationX * rotationY *

rotationZ *translation;

8. // Set pose9. int modelviewUniform = glGetUniformLocation(glProgram_Cube,

"Modelview");10. glUniformMatrix4fv(modelviewUniform, 1, 0,

modelviewMatrix.Pointer());

Page 36: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 36

Draw Cube! 2/2

Draw Cube Polygon

1. // Set Vertex Array2. glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE,

0, cubeVertices);3. // Set Color Array4. glVertexAttribPointer(ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE,

0, cubeColors);5. //Enabled6. glEnableVertexAttribArray(ATTRIB_VERTEX);7. glEnableVertexAttribArray(ATTRIB_COLOR);

8. // Draw9. glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT,

cubeIndices);

Page 37: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 37

Vertex of Cube

Draw Cube Polygon

1. // Vertex List of Cube2. const GLfloat cubeVertices[] = {3. /* x y z */4. -1.0, -1.0, 1.0, //05. 1.0, -1.0, 1.0, //16. -1.0, 1.0, 1.0, //27. 1.0, 1.0, 1.0, //38. -1.0, -1.0, -1.0, //49. 1.0, -1.0, -1.0, //510. -1.0, 1.0, -1.0, //611. 1.0, 1.0, -1.0, //712. };

Page 38: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 38

How to Draw Polygon?

TRIANGLE_STRIP

Joint 2 Points

TRIANGLES

Draw each Triangle

TRIANGLE_FAN

Joint 2 Points, but MUST use 1st Point

QUAD_STRIP

Joint 2 Points

QUAD

Draw each Square

POLYGON

Draw as Polygon

Page 39: How to Use OpenGL/ES on Native Activity

©SIProp Project, 2006-2008 39

Today’s Target