/// // Initialize the shader and program object // int Init ( ESContext *esContext ) { UserData *userData = esContext->userData; GLbyte vShaderStr[] = "attribute vec4 a_position; \n" "attribute vec3 a_normal; \n" "varying vec3 v_normal; \n" "void main() \n" "{ \n" " gl_Position = a_position; \n" " v_normal = a_normal; \n" "} \n"; GLbyte fShaderStr[] = "precision mediump float; \n" "varying vec3 v_normal; \n" "uniform samplerCube s_texture; \n" "void main() \n" "{ \n" " gl_FragColor = textureCube( s_texture, v_normal );\n" "} \n"; // Load the shaders and get a linked program object userData->programObject = esLoadProgram ( vShaderStr, fShaderStr ); // Get the attribute locations userData->positionLoc = glGetAttribLocation ( userData->programObject, "a_position" ); userData->normalLoc = glGetAttribLocation ( userData->programObject, "a_normal" ); // Get the sampler locations userData->samplerLoc = glGetUniformLocation ( userData->programObject, "s_texture" ); // Load the texture userData->textureId = CreateSimpleTextureCubemap (); // Generate the vertex data userData->numIndices = esGenSphere ( 20, 0.75f, &userData->vertices, &userData->normals, NULL, &userData->indices ); glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); return TRUE; }
void Sphere::initWithSlice(int slices,float radius) { float *vertex, *texCoord, *normal,*tangent; int *indice; _aabb._minBox = GLVector3(-radius,-radius,-radius); _aabb._maxBox = GLVector3(radius, radius, radius); _numberOfIndice = esGenSphere(slices, radius, &vertex, &normal, &tangent, &texCoord, &indice, &_numberOfVertex); glGenBuffers(1, &_vertexVBO); glBindBuffer(GL_ARRAY_BUFFER, _vertexVBO); glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float)*_numberOfVertex, vertex, GL_STATIC_DRAW); // glGenBuffers(1, &_texCoordVBO); glBindBuffer(GL_ARRAY_BUFFER, _texCoordVBO); glBufferData(GL_ARRAY_BUFFER, 2 * sizeof(float)*_numberOfVertex, texCoord, GL_STATIC_DRAW); // glGenBuffers(1, &_normalVBO); glBindBuffer(GL_ARRAY_BUFFER, _normalVBO); glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float)*_numberOfVertex, normal, GL_STATIC_DRAW); // glGenBuffers(1, &_indiceVBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indiceVBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*_numberOfIndice, indice, GL_STATIC_DRAW); // glGenBuffers(1, &_tangentVBO); glBindBuffer(GL_ARRAY_BUFFER,_tangentVBO); glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(float)*_numberOfVertex, tangent,GL_STATIC_DRAW); //free memory delete vertex; delete texCoord; delete normal; delete indice; delete tangent; vertex = NULL; texCoord = NULL; normal = NULL; indice = NULL; tangent = NULL; }
int main(int argc, char *argv[]) { EGLDisplay display; EGLint egl_major, egl_minor; EGLConfig config; EGLint num_config; EGLContext context; EGLSurface surface; GLuint vertex_shader; GLuint fragment_shader; GLuint program; GLint ret; GLint width, height; #ifdef HOOK the_hook("/mnt/sdcard/egl2.fdr"); #endif const char *vertex_shader_source = "uniform mat4 modelviewMatrix;\n" "uniform mat4 modelviewprojectionMatrix;\n" "uniform mat3 normalMatrix;\n" "\n" "attribute vec4 in_position; \n" "attribute vec3 in_normal; \n" "attribute vec2 in_texcoord; \n" "\n" "vec4 lightSource = vec4(2.0, 2.0, 20.0, 0.0);\n" " \n" "varying vec4 vColor; \n" "varying vec2 vTexCoord; \n" "uniform sampler2D s_texture; \n" " \n" "void main() \n" "{ \n" " float texvalue = texture2D(s_texture, in_texcoord).x;\n" " gl_Position = modelviewprojectionMatrix * (in_position + vec4(0.2 * texvalue * in_normal, 0));\n" " vec3 vEyeNormal = normalMatrix * in_normal;\n" " vec4 vPosition4 = modelviewMatrix * in_position;\n" " vec3 vPosition3 = vPosition4.xyz / vPosition4.w;\n" " vec3 vLightDir = normalize(lightSource.xyz - vPosition3);\n" " float diff = max(0.0, dot(vEyeNormal, vLightDir));\n" " vColor = vec4(diff, 0.0, 0.0, 1.0);\n" " vTexCoord = in_texcoord;\n" "} \n"; const char *fragment_shader_source = "precision mediump float; \n" " \n" "varying vec4 vColor; \n" "varying vec2 vTexCoord; \n" " \n" "void main() \n" "{ \n" " gl_FragColor = vColor;// * texture2D(s_texture, vTexCoord); \n" "} \n"; display = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (display == EGL_NO_DISPLAY) { printf("Error: No display found!\n"); return -1; } if (!eglInitialize(display, &egl_major, &egl_minor)) { printf("Error: eglInitialise failed!\n"); return -1; } printf("Using display %p with EGL version %d.%d\n", display, egl_major, egl_minor); printf("EGL Version \"%s\"\n", eglQueryString(display, EGL_VERSION)); printf("EGL Vendor \"%s\"\n", eglQueryString(display, EGL_VENDOR)); printf("EGL Extensions \"%s\"\n", eglQueryString(display, EGL_EXTENSIONS)); /* get an appropriate EGL frame buffer configuration */ eglChooseConfig(display, config_attribute_list, &config, 1, &num_config); /* create an EGL rendering context */ context = eglCreateContext(display, config, EGL_NO_CONTEXT, context_attribute_list); if (context == EGL_NO_CONTEXT) { printf("Error: eglCreateContext failed: %d\n", eglGetError()); return -1; } surface = eglCreatePbufferSurface(display, config, pbuffer_attribute_list); if (surface == EGL_NO_SURFACE) { printf("Error: eglCreatePbufferSurface failed: %d (%s)\n", eglGetError(), eglStrError(eglGetError())); return -1; } if (!eglQuerySurface(display, surface, EGL_WIDTH, &width) || !eglQuerySurface(display, surface, EGL_HEIGHT, &height)) { printf("Error: eglQuerySurface failed: %d (%s)\n", eglGetError(), eglStrError(eglGetError())); return -1; } printf("PBuffer: %dx%d\n", width, height); printf("GL Extensions \"%s\"\n", glGetString(GL_EXTENSIONS)); /* connect the context to the surface */ if (!eglMakeCurrent(display, surface, surface, context)) { printf("Error: eglMakeCurrent() failed: %d (%s)\n", eglGetError(), eglStrError(eglGetError())); return -1; } vertex_shader = glCreateShader(GL_VERTEX_SHADER); if (!vertex_shader) { printf("Error: glCreateShader(GL_VERTEX_SHADER) failed: %d (%s)\n", eglGetError(), eglStrError(eglGetError())); return -1; } glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); glCompileShader(vertex_shader); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &ret); if (!ret) { char *log; printf("Error: vertex shader compilation failed!:\n"); glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &ret); if (ret > 1) { log = malloc(ret); glGetShaderInfoLog(vertex_shader, ret, NULL, log); printf("%s", log); } return -1; } else printf("Vertex shader compilation succeeded!\n"); fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); if (!fragment_shader) { printf("Error: glCreateShader(GL_FRAGMENT_SHADER) failed: %d (%s)\n", eglGetError(), eglStrError(eglGetError())); return -1; } glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); glCompileShader(fragment_shader); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &ret); if (!ret) { char *log; printf("Error: fragment shader compilation failed!:\n"); glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &ret); if (ret > 1) { log = malloc(ret); glGetShaderInfoLog(fragment_shader, ret, NULL, log); printf("%s", log); } return -1; } else printf("Fragment shader compilation succeeded!\n"); program = glCreateProgram(); if (!program) { printf("Error: failed to create program!\n"); return -1; } GLfloat *vVertices; GLfloat *vNormals; GLfloat *vTexCoords; GLushort *vIndices; int numIndices = esGenSphere(40, 1.0f, &vVertices, &vNormals, &vTexCoords, &vIndices, NULL); GLuint texId = createSimpleTexture(); glAttachShader(program, vertex_shader); glAttachShader(program, fragment_shader); glBindAttribLocation(program, 0, "in_position"); glBindAttribLocation(program, 1, "in_normal"); glBindAttribLocation(program, 2, "in_texcoord"); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &ret); if (!ret) { char *log; printf("Error: program linking failed!:\n"); glGetProgramiv(program, GL_INFO_LOG_LENGTH, &ret); if (ret > 1) { log = malloc(ret); glGetProgramInfoLog(program, ret, NULL, log); printf("%s", log); } return -1; } else printf("program linking succeeded!\n"); glUseProgram(program); glViewport(0, 0, width, height); /* clear the color buffer */ glClearColor(0.5, 0.5, 0.5, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, vNormals); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, vTexCoords); glEnableVertexAttribArray(2); ESMatrix modelview; esMatrixLoadIdentity(&modelview); esTranslate(&modelview, 0.0f, 0.0f, -8.0f); esRotate(&modelview, 45.0f, 1.0f, 0.0f, 0.0f); esRotate(&modelview, 45.0f, 0.0f, 1.0f, 0.0f); esRotate(&modelview, 10.0f, 0.0f, 0.0f, 1.0f); GLfloat aspect = (GLfloat)(height) / (GLfloat)(width); ESMatrix projection; esMatrixLoadIdentity(&projection); esFrustum(&projection, -1.8f, +1.8f, -1.8f * aspect, +1.8f * aspect, 6.0f, 10.0f); ESMatrix modelviewprojection; esMatrixLoadIdentity(&modelviewprojection); esMatrixMultiply(&modelviewprojection, &modelview, &projection); float normal[9]; normal[0] = modelview.m[0][0]; normal[1] = modelview.m[0][1]; normal[2] = modelview.m[0][2]; normal[3] = modelview.m[1][0]; normal[4] = modelview.m[1][1]; normal[5] = modelview.m[1][2]; normal[6] = modelview.m[2][0]; normal[7] = modelview.m[2][1]; normal[8] = modelview.m[2][2]; GLint modelviewmatrix_handle = glGetUniformLocation(program, "modelviewMatrix"); GLint modelviewprojectionmatrix_handle = glGetUniformLocation(program, "modelviewprojectionMatrix"); GLint normalmatrix_handle = glGetUniformLocation(program, "normalMatrix"); GLint sampler_handle = glGetUniformLocation(program, "s_texture"); glUniformMatrix4fv(modelviewmatrix_handle, 1, GL_FALSE, &modelview.m[0][0]); glUniformMatrix4fv(modelviewprojectionmatrix_handle, 1, GL_FALSE, &modelviewprojection.m[0][0]); glUniformMatrix3fv(normalmatrix_handle, 1, GL_FALSE, normal); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texId); glUniform1i(sampler_handle, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, vIndices); glFlush(); fflush(stdout); dump_gl_screen("/sdcard/egl2.bmp", width, height); #ifdef HOOK close_hook(); #endif return 0; }
int main(int argc, char **argv) { int rv; int width = 256; int height = 256; fb_info fb; rv = fb_open(0, &fb); if(rv!=0) { exit(1); } width = fb.fb_var.xres; height = fb.fb_var.yres; rv = viv_open(); if(rv!=0) { fprintf(stderr, "Error opening device\n"); exit(1); } printf("Succesfully opened device\n"); etna_ctx *ctx = 0; struct pipe_context *pipe = 0; etna_bswap_buffers *buffers = 0; if(etna_create(&ctx) != ETNA_OK || etna_bswap_create(ctx, &buffers, (etna_set_buffer_cb_t)&fb_set_buffer, (etna_copy_buffer_cb_t)&etna_fb_copy_buffer, &fb) != ETNA_OK || (pipe = etna_new_pipe_context(ctx)) == NULL) { printf("Unable to create etna context\n"); exit(1); } struct pipe_resource *tex_resource = etna_pipe_create_2d(pipe, ETNA_IS_TEXTURE | ETNA_IS_CUBEMAP, FMT_X8R8G8B8, 1, 1, 0); uint32_t tex_data[6] = { 0xffff0000, 0xff00ff00, 0xff0000ff, 0xffffff00, 0xffff00ff, 0xffffffff }; for(int layerid=0; layerid<6; ++layerid) etna_pipe_inline_write(pipe, tex_resource, layerid, 0, &tex_data[layerid], sizeof(uint32_t)); /* resources */ struct pipe_resource *rt_resource = etna_pipe_create_2d(pipe, ETNA_IS_RENDER_TARGET, PIPE_FORMAT_B8G8R8X8_UNORM, width, height, 0); struct pipe_resource *z_resource = etna_pipe_create_2d(pipe, ETNA_IS_RENDER_TARGET, PIPE_FORMAT_Z16_UNORM, width, height, 0); struct pipe_resource *vtx_resource = etna_pipe_create_buffer(pipe, ETNA_IS_VERTEX, VERTEX_BUFFER_SIZE); struct pipe_resource *idx_resource = etna_pipe_create_buffer(pipe, ETNA_IS_INDEX, VERTEX_BUFFER_SIZE); /* bind render target to framebuffer */ etna_fb_bind_resource(&fb, rt_resource); /* Phew, now we got all the memory we need. * Write interleaved attribute vertex stream. * Unlike the GL example we only do this once, not every time glDrawArrays is called, the same would be accomplished * from GL by using a vertex buffer object. */ GLfloat *vVertices; GLfloat *vNormals; GLfloat *vTexCoords; GLushort *vIndices; int numVertices = 0; int numIndices = esGenSphere(20, 1.0f, &vVertices, &vNormals, &vTexCoords, &vIndices, &numVertices); float *vtx_logical = etna_pipe_get_resource_ptr(pipe, vtx_resource, 0, 0); for(int vert=0; vert<numVertices; ++vert) { int dest_idx = vert * (3 + 3 + 2); for(int comp=0; comp<3; ++comp) vtx_logical[dest_idx+comp+0] = vVertices[vert*3 + comp]; /* 0 */ for(int comp=0; comp<3; ++comp) vtx_logical[dest_idx+comp+3] = vNormals[vert*3 + comp]; /* 1 */ for(int comp=0; comp<2; ++comp) vtx_logical[dest_idx+comp+6] = vTexCoords[vert*2 + comp]; /* 2 */ } memcpy(idx_resource->levels[0].logical, vIndices, numIndices*sizeof(GLushort)); /* compile gallium3d states */ void *blend = pipe->create_blend_state(pipe, &(struct pipe_blend_state) { .rt[0] = { .blend_enable = 0, .rgb_func = PIPE_BLEND_ADD, .rgb_src_factor = PIPE_BLENDFACTOR_ONE, .rgb_dst_factor = PIPE_BLENDFACTOR_ZERO, .alpha_func = PIPE_BLEND_ADD, .alpha_src_factor = PIPE_BLENDFACTOR_ONE, .alpha_dst_factor = PIPE_BLENDFACTOR_ZERO, .colormask = 0xf } });
void Mesh::makeMeASphere(float size, int resolution) { nbrOfIndices = esGenSphere(resolution, size, positions, normals, texCoords, triangles); }
// �뀺�씠�뜑�� �봽濡쒓렇�옩 媛앹껜 珥덇린�솕. int InitShaderAndProgram() { if (!mUserData) return 0; char* vShaderStr = AssetManager::getInstance()->readFile( "YHBumpShader.vert"); char* fShaderStr = AssetManager::getInstance()->readFile( "YHBumpShader.frag"); GLuint vertexShader; GLuint fragmentShader; GLuint programObject; GLint linked; // �젙�젏怨� �봽�옒洹몃㉫�듃 �뀺�씠�뜑 �쟻�옱. vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr); fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr); // �봽濡쒓렇�옩 媛앹껜 �깮�꽦. programObject = glCreateProgram(); if (programObject == 0) return 0; glAttachShader(programObject, vertexShader); glAttachShader(programObject, fragmentShader); // �봽濡쒓렇�옩 留곹겕. glLinkProgram(programObject); // 留곹겕 �긽�깭 �젏寃�. glGetProgramiv(programObject, GL_LINK_STATUS, &linked); if (!linked) { GLint infoLen = 0; glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen); if (infoLen > 1) { char* infoLog = (char*) malloc(sizeof(char) * infoLen); glGetProgramInfoLog(programObject, infoLen, NULL, infoLog); ALOGE("Error linking program : %s", infoLog); free(infoLog); } glDeleteProgram(programObject); return false; } // �봽濡쒓렇�옩 媛앹껜 ���옣. mUserData->programObject = programObject; // Vertex Shader 遺�遺�. mUserData->uModelInverseLocation = glGetUniformLocation( mUserData->programObject, "u_matModelInverse"); mUserData->uViewInverseLocation = glGetUniformLocation( mUserData->programObject, "u_matViewInverse"); mUserData->uViewProjectionLocation = glGetUniformLocation( mUserData->programObject, "u_matViewProjection"); mUserData->uLightPosLocation = glGetUniformLocation( mUserData->programObject, "u_lightPosition"); mUserData->uEyePosLocation = glGetUniformLocation(mUserData->programObject, "u_eyePosition"); mUserData->mvpLoc = glGetUniformLocation(mUserData->programObject, "u_mvpMatrix"); // Fragment Shader 遺�遺�. mUserData->uAmbientLocation = glGetUniformLocation(mUserData->programObject, "u_ambient"); mUserData->uSpecularLocation = glGetUniformLocation( mUserData->programObject, "u_specular"); mUserData->uDiffuseLocation = glGetUniformLocation(mUserData->programObject, "u_diffuse"); mUserData->uSpecularPowerLocation = glGetUniformLocation( mUserData->programObject, "u_specularPower"); mUserData->sBaseMapLocation = glGetUniformLocation(mUserData->programObject, "s_baseMap"); mUserData->sNormalMapLocation = glGetUniformLocation( mUserData->programObject, "s_normalMap"); // �뀓�뒪爾� 濡쒕뵫. mUserData->textureId[0] = create2DTexture("earth_texture.tga", 1280, 640, GL_RGB, GL_RGB, true); mUserData->textureId[1] = create2DTexture("earth_normal.tga", 1280, 640, GL_RGB, GL_RGB, true); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); // Sphere �깮�꽦. mNumberOfIndices = esGenSphere(50, 1, &mSphereVertices, &mSphereNormal, &mSphereBinormal, &mSphereTangent, &mSphereTexCoords, &mSphereIndices); return true; }
/// // Initialize the shader and program object // void Sphere::init(float width, float height) { Drawable::init(width, height); /*char vShaderStr[] = "attribute vec4 av4_position; \n" "uniform mat4 um4_mvp; \n" "void main() \n" "{ \n" " gl_Position = um4_mvp * av4_position; \n" "} \n"; */ char vShaderStr[] = "uniform mat4 um4_MVPMatrix; \n" // A constant representing the combined model/view/projection matrix. "uniform mat4 um4_MVMatrix; \n" // A constant representing the combined model/view matrix. "uniform vec3 uv3_LightPos; \n" // The position of the light in eye space. "uniform vec4 uv4_Color; \n" "attribute vec4 av4_Position; \n" // Per-vertex position information we will pass in. "attribute vec3 av3_Normal; \n" // Per-vertex normal information we will pass in. "varying vec4 v4_Color; \n" // This will be passed into the fragment shader. "void main() \n" // The entry point for our vertex shader. "{ \n" // Transform the vertex into eye space. " vec3 modelViewVertex = vec3(um4_MVMatrix * av4_Position); \n" // Transform the normal's orientation into eye space. " vec3 modelViewNormal = vec3(um4_MVMatrix * vec4(av3_Normal, 0.0)); \n" // Will be used for attenuation. " float distance = length(uv3_LightPos - modelViewVertex); \n" // Get a lighting direction vector from the light to the vertex. " vec3 lightVector = normalize(uv3_LightPos - modelViewVertex); \n" // Calculate the dot product of the light vector and vertex normal. // If the normal and light vector are // pointing in the same direction then it will get max illumination. " float diffuse = max(dot(modelViewNormal, lightVector), 0.1); \n" // Attenuate the light based on distance. " diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance))); \n" // Multiply the color by the illumination level. It will be interpolated across the triangle. " v4_Color = uv4_Color * diffuse; \n" // gl_Position is a special variable used to store the final position. // Multiply the vertex by the matrix to get the final point in normalized screen coordinates. " gl_Position = um4_MVPMatrix * av4_Position; \n" "} \n"; char fShaderStr[] = "#ifdef GL_ES \n" "precision mediump float; \n" "#endif \n" "varying vec4 v4_Color; \n" "void main() \n" "{ \n" " gl_FragColor = v4_Color; \n" "} \n"; esContext.width = width; esContext.height = height; // Load the shaders and get a linked program object userData.programObject = esCreateProgram(vShaderStr, fShaderStr); userData.positionLoc = glGetAttribLocation(userData.programObject, "av4_Position"); userData.normalsLoc = glGetAttribLocation(userData.programObject, "av3_Normal"); userData.colorLoc = glGetUniformLocation(userData.programObject, "uv4_Color"); userData.mvpLoc = glGetUniformLocation(userData.programObject, "um4_MVPMatrix"); userData.mvLoc = glGetUniformLocation(userData.programObject, "um4_MVMatrix"); userData.lightPosLoc = glGetUniformLocation(userData.programObject, "uv3_LightPos"); userData.numIndices = esGenSphere(60, 0.5f, &userData.vertices, &userData.normals, NULL, &userData.indices); }
int main(int argc, char **argv) { struct fbdemos_scaffold *fbs = 0; fbdemo_init(&fbs); int width = fbs->width; int height = fbs->height; struct pipe_context *pipe = fbs->pipe; /* resources */ struct pipe_resource *rt_resource = fbdemo_create_2d(fbs->screen, PIPE_BIND_RENDER_TARGET, PIPE_FORMAT_B8G8R8X8_UNORM, width, height, 0); struct pipe_resource *z_resource = fbdemo_create_2d(fbs->screen, PIPE_BIND_RENDER_TARGET, PIPE_FORMAT_Z16_UNORM, width, height, 0); struct pipe_resource *vtx_resource = pipe_buffer_create(fbs->screen, PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_IMMUTABLE, VERTEX_BUFFER_SIZE); struct pipe_resource *idx_resource = pipe_buffer_create(fbs->screen, PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_IMMUTABLE, VERTEX_BUFFER_SIZE); /* bind render target to framebuffer */ etna_fb_bind_resource(&fbs->fb, rt_resource); /* Phew, now we got all the memory we need. * Write interleaved attribute vertex stream. * Unlike the GL example we only do this once, not every time glDrawArrays is called, the same would be accomplished * from GL by using a vertex buffer object. */ float *vVertices; float *vNormals; float *vTexCoords; uint16_t *vIndices; int numVertices = 0; int numIndices = esGenSphere(80, 1.0f, &vVertices, &vNormals, &vTexCoords, &vIndices, &numVertices); unsigned vtxStride = 3+3+2; assert((numVertices * vtxStride*4) < VERTEX_BUFFER_SIZE); struct pipe_transfer *vtx_transfer = 0; float *vtx_logical = pipe_buffer_map(pipe, vtx_resource, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_UNSYNCHRONIZED, &vtx_transfer); for(int vert=0; vert<numVertices; ++vert) { int dest_idx = vert * vtxStride; for(int comp=0; comp<3; ++comp) vtx_logical[dest_idx+comp+0] = vVertices[vert*3 + comp]; /* 0 */ for(int comp=0; comp<3; ++comp) vtx_logical[dest_idx+comp+3] = vNormals[vert*3 + comp]; /* 1 */ for(int comp=0; comp<2; ++comp) vtx_logical[dest_idx+comp+6] = vTexCoords[vert*2 + comp]; /* 2 */ } pipe_buffer_unmap(pipe, vtx_transfer); assert((numIndices * 2) < VERTEX_BUFFER_SIZE); struct pipe_transfer *idx_transfer = 0; void *idx_logical = pipe_buffer_map(pipe, idx_resource, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_UNSYNCHRONIZED, &idx_transfer); memcpy(idx_logical, vIndices, numIndices*sizeof(uint16_t)); pipe_buffer_unmap(pipe, idx_transfer); /* compile gallium3d states */ void *blend = pipe->create_blend_state(pipe, &(struct pipe_blend_state) { .rt[0] = { .blend_enable = 0, .rgb_func = PIPE_BLEND_ADD, .rgb_src_factor = PIPE_BLENDFACTOR_ONE, .rgb_dst_factor = PIPE_BLENDFACTOR_ZERO, .alpha_func = PIPE_BLEND_ADD, .alpha_src_factor = PIPE_BLENDFACTOR_ONE, .alpha_dst_factor = PIPE_BLENDFACTOR_ZERO, .colormask = 0xf } });