用到了nehe的common中的TextureReader类

package test.d717;* Copyright (c) 2015, 2015  Technologies Corporation.import java.awt.FlowLayout;
import java.awt.Frame;
import java.io.IOException;import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import javax.swing.SwingUtilities;import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;import com.sun.opengl.util.FPSAnimator;public class BasicF implements GLEventListener {static Display display;static Shell shell;static FPSAnimator animator;/*** 纹理理标号*/private int texture_int;private GL gl;private final GLU glu = new GLU();/*** 申请纹理*/private int genTexture(final GL gl) {final int[] tmp = new int[1];gl.glGenTextures(1, tmp, 0);return tmp[0];}/*** 生成纹理*/private void makeRGBTexture(final GL gl, final GLU glu, final TextureReader.Texture img, final int target, final boolean mipmapped) {if (mipmapped) {/*** 生成纹理,gluBuild2DMipmaps() 和 glTexImage2D() 两个都是生成纹理的。* 两者的区别就是:* 使用glTexImage2D()时所采用的位图文件分辨率必须为:64×64、128×128、256×256三种格式,如果其他大小则会出现绘制不正常。* gluBuild2DMipmaps()支持任意分辨率位图文件。*/glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img.getPixels());} else {/*** 下面一行告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D )。* 参数“0”代表图像的详细程度,通常就由它为零去了。* 参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。* img.getWidth() 是纹理的宽度。如果您知道宽度,您可以在这里填入,* 但计算机可以很容易的为您指出此值。* img.getHeight() 是纹理的高度。参数零是边框的值,一般就是“0”。* GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。* GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。* img.getPixels()告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage[0] 记录中的数据。*/gl.glTexImage2D(target, 0, 3, img.getWidth(), img.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img.getPixels());}}@Overridepublic void init(final GLAutoDrawable drawable) { // 初始函数gl = drawable.getGL();gl.glClearColor(0.0f, 0.0f, 0.0f, 1f); // 设置背景颜色// gl.glViewport(0, 0, 100, 100); // 视点大小,一个视口时候没必要用这个gl.glMatrixMode(GL.GL_PROJECTION);gl.glLoadIdentity();glu.gluOrtho2D(0, 100, 0.0, 100.0); // 使坐标系统出现在GL里,此时屏幕中最左面是坐标0,右面是100,最下0,嘴上100gl.glEnable(GL.GL_TEXTURE_2D);// 开启纹理texture_int = genTexture(gl);gl.glBindTexture(GL.GL_TEXTURE_2D, texture_int);// 绑定纹理TextureReader.Texture texture_A = null;try {// 得到图片所对应的纹理texture_A = TextureReader.readTexture("demos/data/images/cc.bmp");// xiaogang.png cc.bmp} catch (final IOException e) {e.printStackTrace();throw new RuntimeException(e);}makeRGBTexture(gl, glu, texture_A, GL.GL_TEXTURE_2D, false);/*** 下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大* ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小* ( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。* 通常这两种情况下我都采用 GL_LINEAR 。这使得纹理从很远处到离屏幕很* 近时都平滑显示。使用 GL_LINEAR 需要CPU和显卡做更多的运算。* 如果您的机器很慢,您也许应该采用 GL_NEAREST 。过滤的纹理在放大的时候,* 看起来斑驳的很『译者注:马赛克啦』。您也可以结合这两种滤波方式。* 在近处时使用 GL_LINEAR ,远处时 GL_NEAREST 。*/gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);// TODOSystem.out.println(texture_A.getWidth() + "," + texture_A.getHeight());}@Overridepublic void display(final GLAutoDrawable drawable) { // 画图函数gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 填充背景颜色gl.glColor3f(255.0f, 255.0f, 255.0f); // 设置GL的画图颜色,也就是画刷的颜色/*** 如果您在您的场景中使用多个纹理,您应该使用来* glBindTexture(GL_TEXTURE_2D, texture_int[ 所使用纹理对应的数字 ])* 选择要绑定的纹理。当您想改变纹理时,应该绑定新的纹理。* 有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理,* 必须在 glBegin() 之前或 glEnd() 之后绑定。*/gl.glBindTexture(GL.GL_TEXTURE_2D, texture_int);gl.glBegin(GL.GL_QUADS);gl.glTexCoord2f(0.0f, 0.0f);// 左下gl.glVertex2f(0f, 0f);gl.glTexCoord2f(1.0f, 0.0f);// 右下gl.glVertex2f(100f, 0f);gl.glTexCoord2f(1.0f, 1.0f);// 右上gl.glVertex2f(100f, 100f);gl.glTexCoord2f(0.0f, 1.0f);// 左上gl.glVertex2f(0f, 100f);gl.glEnd();gl.glColor3f(10.0f, 0.0f, 0.0f); // 设置GL的画图颜色,也就是画刷的颜色gl.glBegin(GL.GL_LINES);gl.glVertex2d(5, 5);gl.glVertex2d(95, 5);gl.glEnd();gl.glFlush();}@Overridepublic void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {}@Overridepublic void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) {}public Frame creatSWT() {display = Display.getDefault();shell = new Shell();shell.setSize(550, 550);shell.setText("SWT_OpenGL");shell.setLayout(null);final Composite compSWT = new Composite(shell, SWT.EMBEDDED);// SWT.EMBEDDED必须compSWT.setSize(500, 500);compSWT.setLocation(0, 0);final java.awt.Frame frame = SWT_AWT.new_Frame(compSWT);frame.setLayout(new FlowLayout());shell.layout();shell.open();return frame;}public static void main(final String[] args) {final GLCapabilities capabilities = new GLCapabilities();final GLCanvas glcanvas = new GLCanvas(capabilities);// 创建画布final BasicF basicFrame = new BasicF();glcanvas.addGLEventListener(basicFrame);// basicFrame重写了GLEventListener的画图的方法glcanvas.setSize(500, 500);animator = new FPSAnimator(glcanvas, 60, true);final Frame frame = basicFrame.creatSWT();frame.add(glcanvas);// 把画布放进 窗口内SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {animator.start(); // 开始动画线程}});while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}animator.stop();display.dispose();}}

over

jogl 纹理贴图相关推荐

  1. zb如何导出自己画的_zbrush纹理贴图(zbrush怎么导出映射贴图)

    ZBrush中贴图纹理怎么画不出来了? ZBrush3.0可以直接绘制纹理贴图或者颜色贴图,但是在使用中不会直接反映到纹理贴图窗口了,所以有 朋友说没有办法导出纹理贴图.实际只要按颜色到纹理按钮就可以 ...

  2. C++ Opengl纹理贴图源码

    C++ Opengl纹理贴图源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...

  3. OpenGL png图片 纹理贴图,去除png图片黑边

    http://blog.csdn.net/cjkwin/article/details/6011882 用libpng把png图片读出来就可以用读出的数据生成文理了. 将png图片作为纹理贴图,在图片 ...

  4. zbrush 添加纹理贴图_zbrush零基础新手必看入门讲解

    哈喽大家好,我是你们的好朋友叮当. zbrush ZBrush操作所需的屏幕分辨率较高,当显示器没法达到所需分辨率时,菜单就会智能化的分两行显示,ZBrush的菜单是按照英文字母顺序来排列的,使用起来 ...

  5. GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

    这章介绍在片元shader中计算导数近似值的技术.这个技术把特别的值载入纹理mipmap的每个级别,以特殊的方式使用纹理映射硬件,计算出导数的结果,给出在屏幕上的像素间某个量的变化率. Cg标准程序库 ...

  6. 纹理窗口Qt+OpenGL之纹理贴图

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下纹理窗口 NeNe的代码中是加载到了一个正方体当中,代码很长.其实单纯的想要纹理贴图是很便利的.具体的纹理贴图技巧在 ...

  7. 【转】glTexImage2D()和gluBuild2DMipmaps() [将载入的位图文件(*.bmp)转换成纹理贴图]+glTexParameteri()纹理过滤函数...

    glTexImage2D()和gluBuild2DMipmaps() 说明:两者的都是生成纹理,即:将载入的位图文件(*.bmp)转换成纹理贴图. glTexImage2D()的用法举例 glTexI ...

  8. Windows 8 Directx 开发学习笔记(十一)地形纹理贴图

    前一篇实现木箱贴图时,木箱的六个面都正好用一整张纹理图,即六个面的纹理坐标均在[0,1]内.然而在为比较大的模型贴图时,像山峰河谷模型,如果只用一张纹理图,那么每个三角形只得到几个纹理元素,无法为提供 ...

  9. Windows 8 Directx 开发学习笔记(十)纹理贴图实现旋转的木箱

    纹理贴图映射(texturemapping)是可以显著提高场景细节和真实感的一种技术,基本原理是将图像数据映射到3D三角形表面(之前的文章提到过,三维模型其实是由很多个三角形拼接而成).当使用纹理资源 ...

最新文章

  1. #时间预测算法_改进的智慧交通系统出行时间预测算法
  2. vscode+MinGW+cmake设置轻量ide
  3. char和byte的区别
  4. 一天搞定CSS:文本text--05
  5. Jmeter输出完美报告
  6. 查看家庭组组计算机用户名密码是什么,windows10系统如何查看家庭组密码
  7. Provisioning Services 7.6 入门到精通系列之七:创建虚拟磁盘
  8. mysql怎么消除冗余,mysql剔除冗余数据
  9. 学python需要记笔记吗_开始学python,一些笔记
  10. 上项线体表位置_心理成熟的人都有哪些具体表现呢?
  11. javascript 键值keyCode
  12. 【Flink】flink sql的并行度怎么单独设置
  13. Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
  14. TensorFlow 1.11.0正式版发布了,强力支持Keras
  15. Chrome开发者工具插件
  16. 树莓派4B系统烧录——Raspberry Pi Imager
  17. Visual Studio Community2019 30天试用期过期,无法登录微软账户
  18. Python OpenCV3 计算机视觉秘籍:1~5
  19. REST API 设计
  20. QPE(量子相位估计)

热门文章

  1. matlab多重心法,多重心法例.ppt
  2. 视频画中画的实现(窗口剪裁)
  3. 性能优化的 10 个技巧
  4. 树形DP(放置街灯,uva 10859)
  5. stm32f407探索者开发板(二)——新建工程(基于固件库)
  6. winedt配制miktex路径设置
  7. 训练SSD时,viz报错
  8. Python:'string'字符串内置函数的用法
  9. 车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...
  10. RTP/RTCP工程实践与问题解决方案(合集)