我正在编写一个基本的行星查看器OpenGL Perl应用程序,只是为了好玩.我有基本的工作,与辉煌的星球,通过gluSphere()
旋转与经典的地球纹理贴图应用.
现在,如果我想通过OpenGL应用第二个纹理贴图(比如"地球云")怎么办?
当然,我可以在PhotoShop或其他一些图形应用程序中自己混合两个纹理贴图,但有没有办法通过OpenGL API?
我尝试加载两个纹理并生成mipmap但是行星显示时只应用了第一个纹理,而不是第二个.
我正在尝试谷歌我在标题中提到的,但不知怎的,我找不到它.这不应该那么难,不是吗?
我正在寻找的是一种在iPhone上访问OpenGL ES纹理的方法,以及一种获取/设置像素的方法.我正在寻找什么样的OpenGL ES功能?
我如何实现加载纹理以用作几何体的高光贴图并使用C++在Directx9中渲染它?
我可以参考任何教程或基本示例吗?
我正在尝试加载earth.png并将其放在一个三角形上.图像为256x256.我已经按照在线教程进行了几个小时的讨论,但三角形仍然是白色的.任何人都可以指出我正确的方向.
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureData;
import com.jogamp.opengl.util.texture.TextureIO;
public class test implements GLEventListener {
private Texture earthTexture;
public static void main(String[] args) {
GLProfile glp = GLProfile.getDefault();
GLCapabilities caps = new GLCapabilities(glp);
GLCanvas canvas = new GLCanvas(caps);
final Frame frame = new Frame("AWT Window Test111");
frame.setSize(700, 700);
frame.add(canvas);
frame.setVisible(true);
// by default, an AWT Frame doesn't do anything when you click
// the close button; this bit …
Run Code Online (Sandbox Code Playgroud) 所以我正在使用一堆2048x2048的sprite表,这些表很快就能填满内存.我正在使用以下方法(通过Ray Wenderlich)来加载纹理:
- (GLuint)setupTexture:(NSString *)fileName
{
CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
if (!spriteImage)
{
NSLog(@"Failed to load image %@", fileName);
exit(1);
}
size_t width = CGImageGetWidth(spriteImage);
size_t height = CGImageGetHeight(spriteImage);
GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte));
CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4,CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);
CGContextRelease(spriteContext);
GLuint texName;
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
GLenum err …
Run Code Online (Sandbox Code Playgroud) 有没有办法将libgdx的纹理转换为灰度图像?到目前为止,我已经复制了我想要灰度的图像并且我手动完成了,但我认为这不是最好的解决方案,因为我的游戏使用的图像越来越多,而且它占用了大量的磁盘空间.
我正在研究一款支持OpenGL的2d引擎.
我正在使用stb_image加载图像数据,因此我可以创建OpenGL纹理.我知道OpenGL的UV原点是左下角,我也打算在那个空间中为我的屏幕空间2d顶点工作,即我使用的是glm :: ortho(0,width,0,height,-1,1) ),不反转0和高度.
你可能已经猜到了,我的纹理垂直翻转,但我100%确定我的UV指定正确.
那么:这是由stbi_load存储像素数据引起的吗?我目前只加载PNG文件,所以如果我使用其他文件格式,我不知道是否会导致此问题.是吗?(我现在不能测试,我不在家).
我真的想把屏幕坐标保持在"标准"OpenGL空间......我知道我可以反转正交投影来修复它,但我真的不愿意.
我可以看到两个理智的选择:
1-如果这是由像素数据的stbi_load存储引起的,我可以在加载时将其反转.出于性能原因我有点担心,因为我使用纹理数组(glTexture3d)进行精灵动画,这意味着我需要单独反转纹理贴片,这看起来很痛苦,而不是一般的解决方案.
2-我可以使用纹理坐标转换来垂直翻转GPU上的UV(在我的GLSL着色器中).
可能的第三个选项是使用glPixelStore来指定输入数据......但我找不到告诉它输入像素是垂直翻转的方法.
您对处理我的问题有什么建议?我想我不能是唯一一个使用stbi_load + OpenGL并且遇到这个问题的人.
最后,我的目标平台是PC,Android和iOS :)
编辑:我回答了我自己的问题......见下文.
我遇到了使用共享上下文的问题:
我有两个线程,每个都有一个上下文,比如Thr1(thread1)和Ctx1(Context1)以及Thr2和Ctx2.Ctx2与Ctx1共享创建.
然后,在Thr2中,我使用Ctx2创建一些纹理作为当前上下文,并进行一些渲染.之后,我销毁Ctx2并完成Thr2.
现在问题出现了:在我销毁Ctx2之后,在Ctx2下创建的纹理没有被释放(其中一些,不是全部).我使用gDebugger来配置我的程序,看到这些纹理没有被释放,并列在Ctx1下.
当我重复创建Thr2/Ctx2并创建纹理并破坏Thr2/Ctx2时,纹理变得越来越多,以及内存.
我尝试过的:
在销毁Ctx2之前删除Thr2中的纹理;
在Thr2中使Ctx1成为当前并尝试删除纹理,在Ctx2被破坏之前;
我正在制作一个360度的统一观察者,观看一张360度的照片,我曾经将一个立方体贴图连接到天空盒,而且效果很好.但是立方体贴图的重量迫使我切换到纹理.
所有360观察器教程都说要在其上放置一个带着色器的球体,然后将相机放入其中.当我这样做时,它不能很好地工作,因为当我看到顶部或底部时,我看到图像像这样弯曲:(椅子被假定看起来正常)
当我使用天空盒时,它没有发生.
有人知道为什么会这样吗?
非常感谢你!
shader textures unity-game-engine photosphere google-cardboard
我有一个512x512 SVG,我正在这样绘制到圆形平面上
const texture = new THREE.TextureLoader().load('img/plane.svg');
?
const material = new THREE.MeshBasicMaterial({
transparent: true,
map: texture,
side: THREE.DoubleSide
});
const geometry = new THREE.CircleGeometry(5, 64);
const plane = new THREE.Mesh(geometry, material);
plane.rotation.x = -1;
scene.add(plane);
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是此SVG上面有一些文字,在three.js中呈现时确实很模糊:
如何使它尽可能清晰?
作为参考,以下是SVG呈现为512x512 png的内容: