#ifdef _TEST_ #include "../JCTestManager.h" #include <3DRS/JCRenderer.h> #include <3DRS/JCRenderGroupData.h> #include <3DRS/JCGpuProgram.h> #include #include #include #include <3DRS/JCMaterial.h> #include <3DRS/JCConchMesh.h> #include <3DRS/JCVertexBuffer.h> #include "../../WindowsEnv/winWindows.h" #include "../../WindowsEnv/gles.h" #include #include #include <3DRS/JCMeshBuilder.h> #include #include #include using namespace laya; namespace laya { extern JCWorkerThread* g_DecThread; } /* 0.基本函数的对象检查 1.vertexbuffer 1.rendersys正常 1.能渲染二维 1. 2.多层uv的情况 2.能渲染三维 1.自己创建的模型 2.加载模型文件 2.资源缩减 3.能渲染单张图片 1.原始大小渲染 2.节省模式渲染 1.image缩小 2.贴图缩小 4.能渲染大图集 */ namespace renderTest { const char* _2dvs = R"( attribute vec2 position; attribute vec2 texcoord; attribute vec4 color; uniform vec4 g_DevInfo; uniform mat4 g_OffsetMatrix; varying vec2 texCoord; varying vec4 oColor; void main() { float cx = (position.x*2.0/g_DevInfo.x)-1.0; float cy = -(position.y*2.0/g_DevInfo.y)+1.0; gl_Position = vec4(cx, cy, 0.5, 1.0); texCoord.xy = texcoord; oColor = color; } )"; const char* _2dps = R"( #define PI 3.141593 precision mediump float; uniform sampler2D g_Tex0; uniform vec4 u_color; //rgb,strength uniform vec4 u_blurInfo; //blurw,blurh,texw,texh uniform vec4 u_blur_off; //blurx,blury,offx,offy uniform float g_Alpha; uniform vec4 g_TexRange; //r,g,b表示rgb的亮度调整,w表示饱和度的调整。w从-1到1(0到1?). //fillimage的时候是纹理范围 uniform vec4 g_Filter; //x alpha , y 1-饱和度 z 饱和度/3 varying vec2 texCoord; varying vec4 oColor; //顶点输出的颜色 vec2 getFillImgTexcoord(){ vec2 newTexCoord; newTexCoord.x = mod((texCoord.x-g_TexRange.x),g_TexRange.y)+g_TexRange.x; newTexCoord.y = mod((texCoord.y-g_TexRange.z),g_TexRange.w)+g_TexRange.z; return newTexCoord; } float sigma=u_blurInfo.x/3.0;//3σ以外影响很小。即当σ=1的时候,半径为3 float sig2 = sigma*sigma; float _2sig2 = 2.0*sig2; float gauss1 = 1.0/(2.0*PI*sig2); float getGaussian(float x, float y){ return gauss1*exp(-(x*x+y*y)/_2sig2); } vec4 blur(vec2 texcoord){ const float blurw = 9.0; vec4 vec4Color = vec4(0.0,0.0,0.0,0.0); vec2 halfsz=vec2(blurw,blurw)/2.0/u_blurInfo.zw; vec2 startpos=texcoord-halfsz-u_blur_off.zw; vec2 ctexcoord = startpos; vec2 step = 1.0/u_blurInfo.zw; //每个像素 for(float y = 0.0;y<=blurw; ++y){ ctexcoord.x=startpos.x; for(float x = 0.0;x<=blurw; ++x){ //TODO 纹理坐标的固定偏移应该在vs中处理 vec4Color += texture2D(g_Tex0, ctexcoord)*getGaussian(x-blurw/2.0,y-blurw/2.0); ctexcoord.x+=step.x; } ctexcoord.y+=step.y; } return vec4Color; } vec4 filter(vec4 color){ float avg = dot(color.xyz, g_Filter.zzz); color.rgb = (avg + g_TexRange.xyz*color.rgb*g_Filter.y ); color.a *= g_Filter.x; return color; } //TODO 测试这样写效率是不是降低了 void main(){ vec2 texc = texCoord; #ifdef FILL_IMG_ADJ_TEXC texc = getFillImgTexcoord(); #endif #ifdef TYPE_FILLCOLOR vec4 color = oColor; #elif defined(TYPE_TEXTURE) vec4 color =texture2D(g_Tex0, texc); #elif defined(TYPE_GLOW) vec4 color = blur(texc); color = vec4(u_color.rgb,color.a*u_color.w); #elif defined(TYPE_BLUR) vec4 color = blur(texc); #endif #ifdef USE_FILTER color = filter(color); #endif gl_FragColor=color; #ifdef USE_G_ALPHA gl_FragColor.w*=g_Alpha; #endif } )"; /* class CRender1{ public: JCGpuProgram* m_pTestShader; mesh* m_pTestMesh; Material* m_pTestMaterial; RenderGroupData m_RenderGroupData; ShaderLinkInfo m_ShaderInfo; float m_fV; void setup(){ m_fV = 0; m_pTestShader = new gpuProgram(); buffer bufvs; char* pVSSrc="attribute vec3 g_Position;\ attribute vec2 g_TexCoord0;\ varying vec2 texCoord;\ void main(){\ gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\ texCoord=g_TexCoord0;\ }"; char* pPSSrc="precision mediump float;" "uniform sampler2D g_Tex0;" "varying vec2 texCoord;" "varying vec4 vertColor;" "void main(){" " gl_FragColor=texture2D(g_Tex0, texCoord);\n\ }"; m_pTestShader->setSrc(pVSSrc, pPSSrc); int nProgram = m_pTestShader->compile(); //load jpeg buffer buf; readFileSync("d:/temp/gameicon.png",buf); BitmapData bmp; bool b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp); LayaTexture* pLayaTexture = new LayaTexture(NULL,NULL, LayaTexture::TEXTURE_TYPE_NORMAL); pLayaTexture->setTextureSize(bmp.m_nWidth, bmp.m_nHeight); pLayaTexture->copyImageToTexture(&bmp,0,1,1); m_pTestMaterial = new Material(); m_pTestMaterial->m_fAlpha = 1.0f; m_pTestMaterial->setShaderProgram((Shader*)m_pTestShader); m_pTestMaterial->m_nBlendType = Material::BLEND_TYPE_NORMAL; m_pTestMaterial->m_fColor[0]=1; m_pTestMaterial->m_fColor[1]=1; m_pTestMaterial->m_fColor[2]=0; m_pTestMaterial->m_fColor[3]=0; m_pTestMaterial->m_pTexture[0] = pLayaTexture; m_pTestMesh = new mesh(); //VB m_pTestMesh->createVB(20,4); JCMemClass* pMemBuffer = m_pTestMesh->getVB()->getMemBuffer(0); pMemBuffer->clear(); vertex v[4]={{-0.5f,0.5f,0.5f,0,0}, {0.5f,0.5f,0.5f,1,0}, {0.5f,-0.5f,0.5f,1,1},{-0.5f,-0.5f,0.5f,0,1}}; pMemBuffer->append(v,sizeof(v)); //IB m_pTestMesh->createIB(GL_UNSIGNED_SHORT, 6); pMemBuffer = m_pTestMesh->getIB()->getMemBuffer(0); pMemBuffer->clear(); unsigned short idx[6]={0,1,2,2,0,3}; pMemBuffer->append(idx,sizeof(idx)); VertexDesc* pVertDesc = m_pTestMesh->m_pVertDesc = new VertexDesc(); pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribPostion, GL_FLOAT_VEC3,0,0)); pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribTexCoord0,GL_FLOAT_VEC2,3*4,0)); namedData* pDefMaterialDesc = getDefaultMaterialNamedData(); renderer::bindShaderFetch(m_ShaderInfo,pVertDesc, nProgram, &pDefMaterialDesc,1); m_RenderGroupData.m_pShaderInfo = &m_ShaderInfo; m_RenderGroupData.m_pMaterial = m_pTestMaterial; m_RenderGroupData.m_nBegin=0; m_RenderGroupData.m_nEnd=6; //m_pTestMesh->m_pShaderInfo = &sinfo; } */ /* void runLoop(){ glClearColor(0,0.2f,0,1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //TEST JCMemClass* pMemBuffer = m_pTestMesh->getVB()->getMemBuffer(0); float* pVertex = (float*)pMemBuffer->getBuf(); pVertex[0] = sinf(m_fV); m_fV+=0.1f; pMemBuffer->setChangedFlag(true); m_pTestMaterial->m_fColor[2]=pVertex[0]; renderer::renderMesh(m_pTestMesh, &m_RenderGroupData, (char**)&m_pTestMaterial, 1); } }; void _1_1_1_test(){ class TestRender:public IGLRender{ public: virtual void onGLReady(){ r.setup(); } virtual void renderFrame(long,bool){ r.runLoop(); GLvoid* pix=new char[100]; glReadPixels(0,0,1,1,GL_RGBA,GL_UNSIGNED_BYTE,pix); int a=0; delete [] pix; } virtual void onGLDestory(){ int a=0; } virtual void invalidGLRes(){} virtual void freeGLRes() {} void setProcess(ProcessInterface*) {} CRender1 r; }; GLEnvThread gl; TestRender render; gl.init(&render,800,600); winWindows::handleMessage(NULL); } void _1_1_2_test(){ class TestRender:public IGLRender{ public: virtual void onGLReady(){ //编译shader m_pTestShader = new gpuProgram(); char* pVSSrc="attribute vec3 g_Position;\ attribute vec2 g_TexCoord0;\ attribute vec2 g_TexCoord1;\ varying vec2 tex0;\ varying vec2 tex1;\ void main(){\ gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\ tex0=g_TexCoord0;\ tex1=g_TexCoord0;\ }"; char* pPSSrc="precision mediump float;" "uniform sampler2D g_Tex0;" "uniform sampler2D g_Tex1;" "varying vec2 tex0,tex1;" "varying vec4 vertColor;" "void main(){\ vec4 col1 = texture2D(g_Tex1,tex0);\n\ gl_FragColor=col1+texture2D(g_Tex0, tex0);\n\ }"; m_pTestShader->setSrc(pVSSrc, pPSSrc); int nProgram = m_pTestShader->compile(); //创建mesh m_pTestMesh = new mesh(); //VB m_pTestMesh->createVB(20,4); JCMemClass* pMemBuffer = m_pTestMesh->getVB()->getMemBuffer(0); pMemBuffer->clear(); vertex v[4]={{-0.5f,0.5f,0.5f,0,0}, {0.5f,0.5f,0.5f,1,0}, {0.5f,-0.5f,0.5f,1,1},{-0.5f,-0.5f,0.5f,0,1}}; pMemBuffer->append(v,sizeof(v)); //IB m_pTestMesh->createIB(GL_UNSIGNED_SHORT, 6); pMemBuffer = m_pTestMesh->getIB()->getMemBuffer(0); pMemBuffer->clear(); unsigned short idx[6]={0,1,2,2,0,3}; pMemBuffer->append(idx,sizeof(idx)); //Texture buffer buf; BitmapData bmp; readFileSync("d:/temp/gameicon.png",buf); bool b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp); LayaTexture* pTex1=new LayaTexture(NULL,NULL,100,100,0); pTex1->copyImageToTexture(&bmp,0,1,1); readFileSync("d:/temp/test.jpg",buf); b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp); //createGridBmp(bmp,800,800,20); LayaTexture* pTex2=new LayaTexture(NULL,NULL,100,100,0); pTex2->copyImageToTexture(&bmp,0,1,1); //创建材质 m_pTestMaterial = new Material(); m_pTestMaterial->m_fAlpha = 1.0f; m_pTestMaterial->setShaderProgram((Shader*)m_pTestShader); m_pTestMaterial->m_nBlendType = Material::BLEND_TYPE_NORMAL; m_pTestMaterial->m_fColor[0]=1; m_pTestMaterial->m_pTexture[0] = pTex1; m_pTestMaterial->m_pTexture[1] = pTex2; VertexDesc* pVertDesc = m_pTestMesh->m_pVertDesc = new VertexDesc(); pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribPostion, GL_FLOAT_VEC3,0,0)); pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribTexCoord0,GL_FLOAT_VEC2,3*4,0)); namedData* pDefMaterialDesc = getDefaultMaterialNamedData(); renderer::bindShaderFetch(m_ShaderInfo,pVertDesc, nProgram, &pDefMaterialDesc,1); m_RenderGroupData.m_pShaderInfo = &m_ShaderInfo; m_RenderGroupData.m_pMaterial = m_pTestMaterial; m_RenderGroupData.m_nBegin=0; m_RenderGroupData.m_nEnd=6; } virtual void renderFrame(long,bool){ glClearColor(0.4f,0.2f,0.2f,1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); renderer::renderMesh(m_pTestMesh, &m_RenderGroupData, (char**)&m_pTestMaterial, 1); } virtual void invalidGLRes(){} virtual void freeGLRes() {} virtual void setProcess(ProcessInterface* p_pCurProcess) {} protected: gpuProgram* m_pTestShader; mesh* m_pTestMesh; ShaderLinkInfo m_ShaderInfo; RenderGroupData m_RenderGroupData; Material* m_pTestMaterial; }; TestRender render; GLEnvThread gl; gl.init(&render,600,600); winWindows::handleMessage(NULL); } */ /* void _1_2_1_test3d(){ struct vertex{ float x,y,z; float u,v; float nx,ny,nz; //unsigned int color; }; struct rundata{ Matrix44 matworld; Matrix44 matpers; }; class render3d_1:public IGLRender{ public: void onGLReady(){ //shader m_pShader = new gpuProgram(); char* pVSSrc="precision mediump float; \ attribute vec3 g_Position;\ attribute vec2 g_TexCoord0;\ attribute vec3 g_Normal; \ attribute float g_alpha; \ uniform mat4 g_worldmatrix; \ uniform mat4 g_persmat; \ varying vec2 tex0;\ varying vec3 norm; \ varying float alpha; \ void main(){\ vec4 vpos = vec4(g_Position.xyz,1.0); \ gl_Position = g_persmat*g_worldmatrix*vpos; \ norm = g_Normal; \ tex0=g_TexCoord0;\ alpha = g_alpha; \ }"; char* pPSSrc="precision mediump float;" "uniform sampler2D g_Tex0;" "uniform sampler2D g_Tex1;" "varying vec2 tex0,tex1;" "varying vec3 norm;" "varying vec4 vertColor;" "varying float alpha;" "void main(){\ vec4 col1 = texture2D(g_Tex1,tex0);\n\ gl_FragColor=vec4(col1.xyz, 1.0);\ }"; m_pShader->setSrc(pVSSrc, pPSSrc); int nProgram = m_pShader->compile(); int nVertNum=24; //TODO 需要测试直接创建多流的情况 JCMeshBuilder::Geom geo; JCMeshBuilder::BuildBoxGeo(true,.8f, .8f, .8f,geo); VertexDesc* pVertDesc = m_mesh.m_pVertDesc = new VertexDesc(); //0 pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribPostion, GL_FLOAT_VEC3,0,0)); pVertDesc->m_VertDescs.push_back(VertexDesc::Desc(gpuProgram::shader_AtrribTexCoord0, GL_FLOAT_VEC2,3*4,0)); pVertDesc->m_VertDescs.push_back(VertexDesc::Desc("g_Normal", GL_FLOAT_VEC3,5*4,0)); //1 pVertDesc->m_VertDescs.push_back(VertexDesc::Desc("g_alpha", GL_FLOAT,sizeof(vertex)*nVertNum,1)); int idxnum=36; m_mesh.createVB(sizeof(vertex),nVertNum); m_mesh.createIB(GL_UNSIGNED_SHORT,idxnum); m_mesh.addStream(sizeof(float)); //alpha JCMemClass* pgeo = m_mesh.getVBMem(0); JCMemClass* palpha = m_mesh.getVBMem(1); JCMemClass* pidx = m_mesh.getIB()->getMemBuffer(0); //通知一下实际大小。 pgeo->appendEmpty(sizeof(vertex)*nVertNum); palpha->appendEmpty(nVertNum*sizeof(float)); vertex* pS1 = (vertex*)pgeo->getBuf(); for( int i=0; ix = *(geo.pVertex)++; pS1->y = *geo.pVertex++; pS1->z = *geo.pVertex++; pS1->u = *geo.pUV++; pS1->v = *geo.pUV++; pS1->nx = *geo.pNorm++; pS1->ny = *geo.pNorm++; pS1->nz = *geo.pNorm++; pS1++; } //memcpy(pS1,v,sizeof(v)); char* pS2 = palpha->getBuf(); //memset(pS2,0,palpha->size()); float* pA =(float*)pS2; for(int i=0; iappendEmpty(geo.nIdxNum*sizeof(unsigned short)); char* pidxdt = pidx->getBuf(); memcpy(pidxdt, geo.pIdx,geo.nIdxNum*sizeof(unsigned short)); //Texture BitmapData bmp = loadLocalImageSync("d:/temp/test.jpg"); LayaTexture* pTex1=new LayaTexture(NULL,NULL,200,200,0); pTex1->copyImageToTexture(&bmp,0,1,1); delete [] bmp.m_pImageData; //创建材质 m_pMaterial = new Material(); m_pMaterial->m_fAlpha = 1.0f; m_pMaterial->setShaderProgram((Shader*)m_pShader); m_pMaterial->m_nBlendType = Material::BLEND_TYPE_NORMAL; m_pMaterial->m_fColor[0]=1; m_pMaterial->m_pTexture[0] = pTex1; m_pMaterial->m_bEnableZ=true; namedData* pDefMaterialDesc = getDefaultMaterialNamedData(); namedData* pRundata = new namedData(); pRundata->add("g_worldmatrix",0,namedData::tp_mat4,1); pRundata->add("g_persmat",(int)(&((rundata*)0)->matpers), namedData::tp_mat4,1); namedData* datadesc[2]={pDefMaterialDesc,pRundata}; renderer::bindShaderFetch(m_ShaderInfo,pVertDesc, nProgram, datadesc,2); m_RenderGroupData.m_pShaderInfo = &m_ShaderInfo; m_RenderGroupData.m_pMaterial = m_pMaterial; m_RenderGroupData.m_nBegin=0; m_RenderGroupData.m_nEnd=idxnum; //TODO glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_ALPHA_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); int a=0; } void renderFrame(long,bool){ glClearColor(0.4f,0.2f,0.2f,1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); Matrix44 matw; static float f=(Pi/4.0f); f+=0.01f; matw = Matrix44::CreateFromAxisAngle(float3(1,1.0f,0),f); Matrix44 matper = Matrix44::CreatePerspective(800,600,1,10); Matrix44& mat = m_RunData.matworld; matw.M43 = -2; mat = matw; //mat.M41=sinf(f); //mat.M43 = 0.6f; Matrix44& persmat = m_RunData.matpers; persmat =Matrix44::CreatePerspectiveFieldOfView(80.0f*Pi/180.0f,1.0f,0.1f,10.0f); char* pdata[2]; pdata[0]=(char*)m_pMaterial; pdata[1]=(char*)&m_RunData; if(0) renderer::renderMesh(&m_mesh, &m_RenderGroupData, (char**)pdata, 2); else{ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); GLuint texs[2]={m_pMaterial->m_pTexture[0]->m_pGpuTexture,m_pMaterial->m_pTexture[0]->m_pGpuTexture}; renderer::renderMesh1(&m_mesh,m_RenderGroupData.m_nBegin, m_RenderGroupData.m_nEnd, m_pMaterial->m_pShaderProgram->m_nProgram, (ShaderLinkInfo*)m_RenderGroupData.m_pShaderInfo, (int*)texs,2,(int*)texs,2,pdata,2); } mat.M41=0.2f; //renderer::renderMesh(&m_mesh, &m_RenderGroupData, (char**)pdata, 2); } virtual void invalidGLRes() {} virtual void freeGLRes() {} virtual void setProcess(ProcessInterface* p_pCurProcess) {} mesh m_mesh; gpuProgram* m_pShader; Material* m_pMaterial; rundata m_RunData; ShaderLinkInfo m_ShaderInfo; RenderGroupData m_RenderGroupData; }; render3d_1 renderor; GLEnvThread gl; gl.init(&renderor,800,600); winWindows::handleMessage(NULL); } void _1_2_1_test3dmodel(){ class Renderer:public IGLRender{ }; } void _2_1_test(){ Process proc(NULL); LayaTexture* pTex = new LayaTexture(NULL,NULL,2048,2048,0); pTex->setScale( 2,3,2,3); BitmapData bmpdata; createGridBmp(bmpdata,20,20,4); // BitmapData downd; int frac[]={1,2,1,2}; downsampleBmp(bmpdata,downd,frac,false); ImageBaseInfo ifo={downd.m_nWidth,downd.m_nHeight,32}; saveAsJpeg(downd.m_pImageData, ifo,"d:/temp/ss.jpg"); int borderFlag = ResBase::BOARDER_TYPE_RIGHT|ResBase::BOARDER_TYPE_BOTTOM; //这个函数会缩小贴图 //pTex->copyImageToTexture(&bmpdata,borderFlag,1,1); //pTex->mergeTexture(&bmpdata,borderFlag,0,0,1,1); int rssz = pTex->getResSize(); int width = pTex->getWidth(); } void _3_1_testdrawImageCB(resStateDispatcher*, bool* bEnd){ *bEnd=true; } void _3_1_testOnUpdate(void* pParam){ if(pParam){ int* pPars=(int*)pParam; RenderImg* pRImg = (RenderImg*)pPars[0]; LayaContext* pCtx = (LayaContext*)pPars[1]; //p_nPaintKey为0则不会引起重新更新mesh //pRImg->render(pCtx,0,NULL,0,0,pRImg->m_pImage->getWidth(),pRImg->m_pImage->getHeight()); pRImg->render(pCtx,1,NULL,0.0f,0.0f,(float)pRImg->m_pImage->getWidth(),(float)pRImg->m_pImage->getHeight()); } } void _3_1_testdrawImage(){ ConchRender* pRender = new ConchRender(); Process* pProc = new Process(NULL); pProc->m_onprocessupdate = _3_1_testOnUpdate; pRender->setProcess(pProc); pProc->setRunParam("not.exist.js",""); pProc->active(); Sleep(100); //Node* n1 = new Node(pProc,0,NULL); Image img(""); bool bLoadEnd=false; img.setSrc(pProc,"d:/temp/test.jpg");// gameicon.png"); img.setOnReadyCB(boost::bind(_3_1_testdrawImageCB,_1,&bLoadEnd)); //img.rect(0,0,100,100); {int i=0; while(!bLoadEnd && i<1000){i++;Sleep(10);}} //LayaContext ctx(NULL, pProc); //TODO 问题 process中会自动创建一个 rootcontext, 是不是有点不灵活 LayaContext* pRootCtx = pProc->getRootContext(); pRootCtx->transform(1,0,0,1,0,0); pRootCtx->disableClip(true); //下面的正常是在js线程中 RenderImg ri; ri.setImg(&img); ri.render(pRootCtx,0,NULL,0,0,100,100); void* param[2]; param[0]=&ri; param[1]=pRootCtx; pProc->m_pOnProcessUpdateParam = param; GLEnvThread gl; gl.init(pRender,800,600); winWindows::handleMessage(NULL); //Sleep(10000); //delete n1; } void init_3(){ } void uninit_3(){ } void _0_1_test(){ } */ void _1_testRender_GLTread_simp() { class TestRender :public JCIGLRender { public: struct Vertex { float pos[3]; int color; Vertex(float x, float y, float z, int c) { pos[0] = x; pos[1] = y; pos[2] = z; color = c; } }; int nFrmNum = 0; std::function funcExit; JCConchMesh* m_pMesh = nullptr; JCGpuProgramTemplate* m_pShaderTemp = nullptr; JCGpuProgram* m_pProg = nullptr; JCMaterial* m_pMaterial = nullptr; JCShaderLink_Vertex m_LinkVertex; JCShaderLink_Uniform m_LinkUniform; JCRenderGroupData m_RenderGroup; TestRender(std::function f) { funcExit = f; } virtual void onGLReady() { m_pMesh = new JCConchMesh(); m_pMesh->regVertexDesc({ { "g_Pos",GL_FLOAT_VEC3 },{ "color",GL_INT } }, 1); m_pShaderTemp = new JCGpuProgramTemplate( R"( attribute vec3 g_Pos; void main(){ gl_Position = vec4(g_Pos.x, g_Pos.y, g_Pos.z, 1.0); } )", R"( precision mediump float; void main(){ gl_FragColor=vec4(1,1,0,1); } )"); m_pProg = m_pShaderTemp->getInst("", 0); int nProg = m_pProg->getGpuProgram(); m_pMaterial = new JCMaterial(); m_pMaterial->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER); m_pMaterial->setAlpha(1.0f); m_pMaterial->setShaderProgram(m_pProg); JCNamedData* pMaterialDesc = m_pMaterial->getNamedData(); JCVertexDesc& VDesc = m_pMesh->getVertexDesc(1); JCRenderer::link_shader_vertex_uniformdata(m_LinkVertex, m_LinkUniform, &VDesc, m_pProg, &pMaterialDesc, 1,nullptr); JCRenderGroupData* pGroup = m_pMesh->pushElements(1, m_pMaterial, 4, { -0.05f,0.05f,0.5f,0 , 0.05f,0.05f,0.5f,0 , 0.05f,-0.05f,0.5f,0 , -0.05f,-0.05f,0.5f,0 },{ 0,1,2,2,3,0 }); pGroup->m_pShaderVertexInfo = &m_LinkVertex; pGroup->m_pShaderUniformInfo = &m_LinkUniform; } virtual void renderFrame(long p_nCurrentFrame, bool) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.7f, 0.7f,0.7f, 1.0f); nFrmNum++; if (nFrmNum > 100) { funcExit(); } auto sttm = tmGetCurms(); for (int i = 0; i < 100000; i++) { JCRenderer::renderMesh(m_pMesh, &m_pMesh->m_vRenderGroupData[0], nullptr, 0); } int dt = tmGetCurms() - sttm; LOGE("+++++ dt=%d",dt); } virtual void invalidGLRes() { } virtual void freeGLRes() { } }; GLEnvThread gl; TestRender render([&gl]() { gl.m_pWindows->close(); }); gl.init(&render, 800, 600); winWindows::handleMessage(NULL); } void _1_testRender_GLTread_multiGroups() { //不同材质 //不同面类型 //不同顶点格式 class TestRender :public JCIGLRender { public: struct Vertex { float pos[3]; int color; Vertex(float x, float y, float z, int c) { pos[0] = x; pos[1] = y; pos[2] = z; color = c; } }; int nFrmNum = 0; std::function funcExit; JCConchMesh* m_pMesh = nullptr; JCGpuProgramTemplate* m_pTemp1= nullptr; JCGpuProgramTemplate* m_pTemp2 = nullptr; JCGpuProgramTemplate* m_pTemp3 = nullptr; JCGpuProgram* m_pProg = nullptr; JCGpuProgram* m_pProg1 = nullptr; JCGpuProgram* m_pProg2 = nullptr; JCMaterial* m_pMtl = nullptr; JCMaterial* m_pMtl1 = nullptr; JCMaterial* m_pMtl2 = nullptr; JCShaderLink_Vertex m_LinkV,m_LinkV1,m_LinkV2; JCShaderLink_Uniform m_LinkU, m_LinkU1, m_LinkU2; JCRenderGroupData m_RenderGroup; TestRender(std::function f) { funcExit = f; } virtual void onGLReady() { m_pMesh = new JCConchMesh(); m_pMesh->regVertexDesc({ { "g_Pos",GL_FLOAT_VEC3 },{ "color",GL_INT } }, 1); m_pMesh->regVertexDesc({ {"g_Pos",GL_FLOAT_VEC2} }, 2); //mtl m_pProg = (new JCGpuProgramTemplate( R"( attribute vec3 g_Pos; void main(){ gl_Position = vec4(g_Pos.x, g_Pos.y, g_Pos.z, 1.0); } )", R"( precision mediump float; void main(){ gl_FragColor=vec4(1,1,0,1); } )"))->getInst("",0); m_pMtl = new JCMaterial(); m_pMtl->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER); m_pMtl->setAlpha(1.0f); m_pMtl->setShaderProgram(m_pProg); //mtl1 m_pProg1 = (new JCGpuProgramTemplate(R"( attribute vec3 g_Pos; void main(){ gl_Position = vec4(g_Pos.x, g_Pos.y, g_Pos.z, 1.0); } )", R"( precision mediump float; void main(){ gl_FragColor=vec4(1,0,0,1); } )"))->getInst("",0); m_pMtl1 = new JCMaterial(); m_pMtl1->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER); m_pMtl1->setAlpha(1.0f); m_pMtl1->setShaderProgram(m_pProg1); //mtl2 m_pProg2 = (new JCGpuProgramTemplate(R"( attribute vec2 g_Pos; void main(){ gl_Position = vec4(g_Pos.x, g_Pos.y, 0.5, 1.0); } )", R"( precision mediump float; void main(){ gl_FragColor=vec4(0,1.0,0,1.0); } )"))->getInst("",0); m_pMtl2 = new JCMaterial(); m_pMtl2->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER); m_pMtl2->setAlpha(1.0f); m_pMtl2->setShaderProgram(m_pProg1); //link JCNamedData* pMaterialDesc = m_pMtl->getNamedData(); JCVertexDesc& VDesc = m_pMesh->getVertexDesc(1); JCVertexDesc& VDesc1 = m_pMesh->getVertexDesc(2); JCRenderer::link_shader_vertex_uniformdata( m_LinkV, m_LinkU, &VDesc, m_pProg, &pMaterialDesc, 1, nullptr ); JCRenderer::link_shader_vertex_uniformdata( m_LinkV1,m_LinkU1, &VDesc, m_pProg1, &pMaterialDesc, 1,nullptr); JCRenderer::link_shader_vertex_uniformdata( m_LinkV2, m_LinkU2, &VDesc1, m_pProg2, &pMaterialDesc, 1,nullptr); float xoff = -0.7f, yoff = 0.0f; JCRenderGroupData* pGroup = m_pMesh->pushElements(1, m_pMtl, 4, { -0.05f+xoff,0.05f+yoff,0.5f,0 , 0.05f+xoff,0.05f+yoff,0.5f,0 , 0.05f+xoff,-0.05f+yoff,0.5f,0 , -0.05f+xoff,-0.05f+yoff,0.5f,0 }, { 0,1,2,2,3,0 }); pGroup->m_pShaderVertexInfo = &m_LinkV; pGroup->m_pShaderUniformInfo = &m_LinkU; xoff = -0.59f; m_pMesh->pushElements(1, m_pMtl, 4, { -0.05f + xoff,0.05f + yoff,0.5f,0 , 0.05f + xoff,0.05f + yoff,0.5f,0 , 0.05f + xoff,-0.05f + yoff,0.5f,0 , -0.05f + xoff,-0.05f + yoff,0.5f,0 }, { 0,1,2,2,3,0 }); pGroup->m_pShaderVertexInfo = &m_LinkV1; pGroup->m_pShaderUniformInfo = &m_LinkU1; xoff = -0.48f; pGroup= m_pMesh->pushElements(1, m_pMtl1, 4, { -0.05f + xoff,0.05f + yoff,0.5f,0 , 0.05f + xoff,0.05f + yoff,0.5f,0 , 0.05f + xoff,-0.05f + yoff,0.5f,0 , -0.05f + xoff,-0.05f + yoff,0.5f,0 }, { 0,1,2,2,3,0 }); pGroup->m_pShaderVertexInfo = &m_LinkV1; pGroup->m_pShaderUniformInfo = &m_LinkU1; //画线 float w = 800; float h = 600; pGroup = m_pMesh->pushVertex(1, GL_LINE_STRIP, m_pMtl, 3, { 375.0f/w,117.0f/h,0.5f,0, 636.0f/w,405.0f/h,0.5f,0, 207.0f/w,405.0f/h,0.5f,0 }); pGroup->m_pShaderVertexInfo = &m_LinkV; pGroup->m_pShaderUniformInfo = &m_LinkU; //不同的顶点格式 pGroup = m_pMesh->pushVertex(2, GL_TRIANGLE_FAN, m_pMtl2, 7, { 325.0f / w,329.0f / h, 320.0f / w,155.0f / h, 486.0f / w,240.0f / h, 488.0f / w,410.0f / h, 319.0f / w,493.0f / h, 155.0f / w,412.0f / h, 152.0f / w,241.0f / h }); pGroup->m_pShaderVertexInfo = &m_LinkV2; pGroup->m_pShaderUniformInfo = &m_LinkU2; } virtual void renderFrame(long p_nCurrentFrame, bool) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.7f, 0.7f, 0.7f, 1.0f); nFrmNum++; if (nFrmNum > 10000) { funcExit(); } for (auto& g : m_pMesh->m_vRenderGroupData) { JCRenderer::renderMesh(m_pMesh, &g, nullptr, 0); } } virtual void invalidGLRes() { } virtual void freeGLRes() { } }; GLEnvThread gl; TestRender render([&gl]() { gl.m_pWindows->close(); }); gl.init(&render, 800, 600); winWindows::handleMessage(NULL); } void testCanvas_1() { } void _1_testRender_GLTread_mask() { class TestRender :public JCIGLRender { public: struct Vertex { float _x,_y,_u1,_v1,_u2,_v2; int color; Vertex(float x, float y, float u1, float v1, float u2, float v2, int c) { _x = x; _y = y; _u1 = u1; _v1 = v1; _u2 = u2; _v2 = v2; color = c; } }; int nFrmNum = 0; std::function funcExit; JCConchMesh* m_pMesh = nullptr; JCGpuProgram* m_pProg = nullptr; JCMaterial* m_pMaterial = nullptr; JCShaderLink_Vertex m_LinkInfoV; JCShaderLink_Uniform m_LinkInfoU; JCRenderGroupData m_RenderGroup; //JCImage m_imgBk, m_imgMask; JCTexture *m_pTex1, *m_pTex2; TestRender(std::function f) { funcExit = f; } virtual void onGLReady() { m_pMesh = new JCConchMesh(); m_pMesh->regVertexDesc({ { "POSUV",GL_FLOAT_VEC4 },{ "uv2",GL_FLOAT_VEC2 } }, 1); m_pProg = (new JCGpuProgramTemplate(R"( attribute vec4 g_posuv; attribute vec2 uv2; varying vec2 texCoord1; varying vec2 texCoord2; void main(){ gl_Position = vec4(g_posuv.x, g_posuv.y, 0.5, 1.0); texCoord1 = g_posuv.zw; texCoord2 = uv2; } )", R"( precision mediump float; varying vec2 texCoord1; varying vec2 texCoord2; uniform sampler2D g_Tex0; uniform sampler2D g_Tex1; void main(){ vec4 color1 = texture2D(g_Tex0, texCoord1.xy); vec4 color2 = texture2D(g_Tex1, texCoord2.xy);//mask gl_FragColor=vec4(color1.xyz,color1.w*color2.r); } )"))->getInst("",0); int nProg = m_pProg->getGpuProgram(); m_pProg->m_pTemp->setSemantics("abc,ddd,g_posuv,POSUV"); m_pMaterial = new JCMaterial(); m_pMaterial->setBlendType(JCMaterial::BLEND_TYPE_SOURCE_OVER); m_pMaterial->setAlpha(1.0f); m_pMaterial->setShaderProgram(m_pProg); JCNamedData* pMaterialDesc = m_pMaterial->getNamedData(); JCVertexDesc& VDesc = m_pMesh->getVertexDesc(1); JCRenderer::link_shader_vertex_uniformdata( m_LinkInfoV,m_LinkInfoU, &VDesc, m_pProg, &pMaterialDesc, 1,nullptr); JCRenderGroupData* pGroup = m_pMesh->pushElements(1, m_pMaterial, 4, { -0.5f,0.5f,0,0,0,0, 0.5f,0.5f,0.5,0,1,0, 0.5f,-0.5f,0.5,0.5,1,1, -0.5f,-0.5f,0,0.5,0,1 }, { 0,1,2,2,3,0 }); pGroup->m_pShaderUniformInfo = &m_LinkInfoU; pGroup->m_pShaderVertexInfo = &m_LinkInfoV; //两张贴图,模拟遮罩 JCBuffer buf; BitmapData bmp; readFileSync("F:/work/conch5gitsvn/ScriptTest/images/bg2.png", buf); bool b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp); m_pTex1 = new JCTexture(nullptr, TEXTURE_TYPE_NORMAL, bmp.m_nWidth, bmp.m_nHeight); m_pTex1->mergeBitmapDataToTexture(&bmp, (BOARDER_TYPE)0, 0, 0); m_pMaterial->setTexture(0, m_pTex1); readFileSync("F:/work/conch5gitsvn/ScriptTest/images/mask.png", buf); b = loadImageMemSync(buf.m_pPtr, buf.m_nLen, bmp); m_pTex2 = new JCTexture(nullptr, TEXTURE_TYPE_NORMAL, bmp.m_nWidth, bmp.m_nHeight); m_pTex2->mergeBitmapDataToTexture(&bmp, (BOARDER_TYPE)0, 0, 0); m_pMaterial->setTexture(1, m_pTex2); } virtual void renderFrame(long p_nCurrentFrame, bool) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.7f, 0.7f, 0.7f, 1.0f); glEnable(GL_BLEND); nFrmNum++; if (nFrmNum > 10000) { funcExit(); } JCRenderer::renderMesh(m_pMesh, &m_pMesh->m_vRenderGroupData[0], nullptr, 0); } virtual void invalidGLRes() { } virtual void freeGLRes() { } }; GLEnvThread gl; TestRender render([&gl]() { gl.m_pWindows->close(); }); gl.init(&render, 800, 600); winWindows::handleMessage(NULL); } void testMain() { //_1_testRender_GLTread_simp(); //_1_testRender_GLTread_multiGroups(); _1_testRender_GLTread_mask(); /* //TODO 下面这个不太方便 g_DecThread = new workerThread(true); g_DecThread->setThreadName("image decode"); _1_2_1_test3d(); _1_2_1_test3dmodel(); _1_1_2_test(); //_2_1_test(); init_3(); _3_1_testdrawImage(); uninit_3(); _1_1_1_test(); //testRender3D_1(); delete g_DecThread; */ } ADDTESTCASE(testMain, "renderTest"); } #endif