OpenGL的glViewPort窗口设置函数实现分屏

OpenGL的glViewPort窗口设置函数实现分屏

之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图:

 

没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码:

复制代码

 1 //从这里开始进行所有的绘制
 2 void drawCube(void)
 3 {
 4     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //清除屏幕和深度缓存
 5     glMatrixMode(GL_MODELVIEW);
 6     glLoadIdentity();    //重置当前的模型观察矩阵
 7 
 8     glPushMatrix();
 9     {
10         gluLookAt(0, 0, -5, 0, 0, 0, 0, 1, 0);
11         glTranslatef(0.0f, 0.0f, -5.0f);    //移入屏幕 5 个单位
12         glRotatef(xangle_Textures, 1.0f, 0.0f, 0.0f);    //绕X轴旋转
13         glRotatef(yangle_Textures, 0.0f, 1.0f, 0.0f);    //绕Y轴旋转
14         glRotatef(zangle_Textures, 0.0f, 0.0f, 1.0f);    //绕Z轴旋转
15         for (int i = 0; i < 2; i++) {
16             glViewport(i * w_Textures, 0, w_Textures, h_Textures);
17             glBindTexture(GL_TEXTURE_2D, texturesArr[0]);    //选择纹理
18             glBegin(GL_QUADS); {
19                 //前面:纹理顺时针,立方体逆时针
20                 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    //纹理和四边形的左下
21                 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    //纹理和四边形的左上
22                 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    //纹理和四边形的右上
23                 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    //纹理和四边形的右下
24             }glEnd();
25     
26             glBindTexture(GL_TEXTURE_2D, texturesArr[1]);    //选择纹理
27             glBegin(GL_QUADS); {
28                 //后面:纹理顺时针,立方体逆时针
29                 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    //纹理和四边形的左下
30                 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    //纹理和四边形的左上
31                 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    //纹理和四边形的右上
32                 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    //纹理和四边形的右下
33             }glEnd();
34     
35             glBindTexture(GL_TEXTURE_2D, texturesArr[2]);    //选择纹理
36             glBegin(GL_QUADS); {
37                 //顶面:纹理顺时针,立方体逆时针
38                 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    //纹理和四边形的左下
39                 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    //纹理和四边形的左上
40                 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    //纹理和四边形的右上
41                 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    //纹理和四边形的右下
42             }glEnd();
43     
44             glBindTexture(GL_TEXTURE_2D, texturesArr[3]);    //选择纹理
45             glBegin(GL_QUADS); {
46                 //底面:纹理顺时针,立方体逆时针
47                 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    //纹理和四边形的左下
48                 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    //纹理和四边形的左上
49                 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    //纹理和四边形的右上
50                 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    //纹理和四边形的右下
51             }glEnd();
52     
53             glBindTexture(GL_TEXTURE_2D, texturesArr[5]);    //选择纹理
54             glBegin(GL_QUADS); {
55                 //右面:纹理顺时针,立方体逆时针
56                 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    //纹理和四边形的左下
57                 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    //纹理和四边形的左上
58                 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    //纹理和四边形的右上
59                 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    //纹理和四边形的右下
60             }glEnd();
61     
62             glBindTexture(GL_TEXTURE_2D, texturesArr[4]);    //选择纹理
63             glBegin(GL_QUADS); {
64                 //左面:纹理顺时针,立方体逆时针
65 
66                 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    //纹理和四边形的左下
67                 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    //纹理和四边形的左上
68                 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    //纹理和四边形的右上
69                 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    //纹理和四边形的右下
70             }glEnd();
71         }
72     }glPopMatrix();
73     glFlush();
74 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在安卓上使用TextureView进行相机预览和拍照,可以通过设置相机回调函数实现照片存储。以下是实现步骤: 1. 获取相机服务和相机ID ``` CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = cameraManager.getCameraIdList()[0]; //获取第一个相机ID ``` 2. 打开相机并设置TextureView作为预览显示 ``` cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { try { cameraDevice = camera; SurfaceTexture texture = textureView.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface surface = new Surface(texture); captureRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(surface); camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { try { captureSession = session; captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); captureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } ... }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } ... }, null); ``` 3. 设置拍照回调函数,拍照后保存照片 ``` captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureRequestBuilder.addTarget(imageReader.getSurface()); captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, getJpegOrientation(cameraCharacteristics, deviceOrientation)); CaptureRequest captureRequest = captureRequestBuilder.build(); captureSession.capture(captureRequest, new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); Toast.makeText(MainActivity.this, "照片已保存", Toast.LENGTH_SHORT).show(); } }, null); ``` 其中,ImageReader是用来读取拍照结果的类,可以通过以下代码创建: ``` ImageReader imageReader = ImageReader.newInstance(imageWidth, imageHeight, ImageFormat.JPEG, 1); imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireNextImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); save(bytes); image.close(); } }, null); ``` save()函数用来保存照片到文件中,你可以自行实现函数。注意,需要在AndroidManifest.xml文件中添加相机和存储权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值