我是OpenGL ES 1.1 for iPhone的新手.今天,我尝试在黑色背景上绘制png纹理(纹理包含alpha chanel),但结果与源png文件不同.
iPhone和模拟器上的结果:

关灯:

这应该是(更明亮,更模糊):

源纹理文件:

这是我使用的源代码:
//Setup:
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER,0.01);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
static const GLfloat light0Ambient[] = {1.0, 1.0, 1.0, 1.0};
static const GLfloat light0Diffuse[] = {1.0, 1.0, 1.0, 1.0};
static const GLfloat light0Position[] = {0.0, 0.0, 10.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
Run Code Online (Sandbox Code Playgroud)
绘图代码:
glBindTexture(GL_TEXTURE_2D, OYTextID);
glVertexPointer(3, GL_FLOAT, 0, GUI_Vertices);
glNormalPointer(GL_FLOAT, 0, GUI_Normals);
glTexCoordPointer(2, GL_FLOAT, 0, GUI_TexCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); …Run Code Online (Sandbox Code Playgroud) 当我尝试加载三角形时,我收到下一个错误:
Mesh_Mesh_Box001.001: 35: GL_TRIANGLE_STRIP
libpng error: CgBI: unknown critical chunk
但这适用于另一个例子.
到底是怎么回事?
提前致谢.
在opengl(更具体地说是webgl)的纹理上,建议在jpeg和png之间格式化,以便在运行时渲染时更高效?我知道jpeg可能比PNG小,但也许解码可能更昂贵,或者其他.
尝试通过NDK平台在android中执行基于C ++的程序时,编译出现错误,发现未找到'gl.h'和'glext.h'头文件,因为我在C ++代码中都包含了这两个文件。M使用android-ndk-r8并使用Cygwin进行编译。
here s my code:
**ANDROID.MK**
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDK1
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
include $(BUILD_SHARED_LIBRARY)
---
**APPLICATION.MK**
APP_STL := stlport_static
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-3
---
**Viewer.cpp**
#include <iostream>
#import "OpenGLES/ES2/gl.h"
#import "OpenGLES/ES2/glext.h"
//#import <GLKit/GLKEffects.h>
#import <GLKit/GLKMath.h>
#include "Viewer.h"
void Viewer::render() {
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArrayOES( _vertexArray[0]);
// Render the object with GLKit
glDrawArrays(GL_TRIANGLES, 0, 36);
/////////
glBindVertexArrayOES(_vertexArray[1]);
// Render the object with …Run Code Online (Sandbox Code Playgroud) 我想在自定义的UIView中绘制我的opengl动画,我该怎么做.我发现我需要覆盖drawRect方法.这是在下面.
#import "myView.h"
@implementation myView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
Run Code Online (Sandbox Code Playgroud)
我使用界面构建器绘制了一个View,如何链接到该视图并绘制(调用)我的opengl动画类.任何人都可以写一点具体的.我是初学者.谢谢.
当我将纹理应用于形状时,我一直看到它被镜像.GLU.gluLookAt设置为5个单位,因此它是GLU.gluLookAt(gl,0,0,5,0,0,0,0,2,0);. 如果下降5个单位,则x轴将反转,这将是一个更大的问题.
你能告诉我如何将正在加载的位图镜像为纹理吗?我想保持轴的位置和绘制形状的方式,我只想自动镜像位图.
你能告诉我怎么做吗?也许给我一个代码序列来反映x轴上的位图?
我是OpenGL的新手,对此并不了解.我想添加一个3D效果的UIImageView.如何使用OpenGL实现这一目标?我想做一些像这张图片中看到的东西:
我搜索过并发现可以使用OpenGL.我已经用OpenGL 引用了这个链接.我创建了一个立方体,并取得了一些效果
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
Run Code Online (Sandbox Code Playgroud)
但是我用glDrawRangeElements来了解我们可以创建一个3d立方体,但是我不知道如何实现它.
编辑
这是我的代码显示ther vertext和索引数组
const Vertex Vertices [] = {
// Front
{{1, -1, 1}, {1, 0, 0, 1}, {1, 0}},
{{1, 1, 1}, {0, 1, 0, 1}, {1, 1}},
{{-1, 1, 1}, {0, 0, 1, 1}, {0, 1}},
{{-1, -1, 1}, {0, 0, 0, 1}, {0, 0}},
// Back
{{1, 1, -1}, {1, 0, 0, 1}, {0, 1}},
{{-1, -1, -1}, {0, …Run Code Online (Sandbox Code Playgroud) 我正在开发iOS游戏,我使用glDrawArrays(使用cocos2D v1.0.1,使用OpenGL ES 1.1)在纹理方面遇到了一些麻烦.我首先创建一个CGPoints数组,定义一个山的顶部和底部,以及一个纹理坐标数组:
hillVertices[nHillVertices] = CGPointMake((topLeftVertexX)*CC_CONTENT_SCALE_FACTOR(), topLeftVertexY*CC_CONTENT_SCALE_FACTOR());
hillTexCoords[nHillVertices] = CGPointMake((topLeftVertexX)/textureSize.width, 0.0);
nHillVerticies++;
hillVertices[nHillVertices] = CGPointMake((bottomLeftVertexX)*CC_CONTENT_SCALE_FACTOR(), bottomLeftVertexY*CC_CONTENT_SCALE_FACTOR());
hillTexCoords[nHillVertices] = CGPointMake(topLeftVertexX)/textureSize.width, 1.0);
nHillVerticies++;
Run Code Online (Sandbox Code Playgroud)
然后用...画画
glBindTexture(GL_TEXTURE_2D, groundSprite.texture.name);
glVertexPointer(2, GL_FLOAT, 0, hillVertices);
glTexCoordPointer(2, GL_FLOAT, 0, hillTexCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (nHillVertices-1));
Run Code Online (Sandbox Code Playgroud)
在游戏开始时(当"topLeftVertexX"值很小时),山丘看起来很好......

但随着游戏的继续,x偏移值(topLeftVertexX)增加,事情开始恶化......

接近尾声,它变坏了......

我认为问题是在游戏开始时,"topLeftVertexX"值很小,所以结果是
(topLeftVertexX)/textureSize.width
Run Code Online (Sandbox Code Playgroud)
在
hillTexCoords[nHillVertices] = CGPointMake((topLeftVertexX)/textureSize.width, 0.0);
Run Code Online (Sandbox Code Playgroud)
是小.然而,随着游戏的继续和x值的增加,我认为价值变得越来越大,导致某种腐败.textureSize为512x512,"topLeftVertexX"在游戏开始时从0开始,最高可达200,000.
我已经尝试增加三角形的数量(包括添加额外的条带),但这没有用.我也试过使用@jpsarda的CCSpriteBiCurve类,得到了相同的结果.我也尝试使用glHints(例如GL_LINE_SMOOTH_HINT和GL_NICEST),但我没有发现任何有用的东西.
我有什么想法可以解决这个问题吗?
我找到了一个名为Rajawali的 Android 3D图形框架,我正在学习如何使用它.我遵循了最基本的教程,该教程使用1024x512大小的jpg图像渲染一个shpere对象.它在Galaxy Nexus上运行良好,但它在Galaxy Player GB70上无效.
当我说它不起作用时,我的意思是对象出现但纹理没有渲染.最后,在创建纹理并使其工作时,我更改了一些用于Rajawali框架的参数.这是我发现的.
原因来自于GL_TEXTURE_MIN_FILTER设定的地方.在以下四个值中
GLES20.GL_LINEAR_MIPMAP_LINEAR
GLES20.GL_NEAREST_MIPMAP_NEAREST
GLES20.GL_LINEAR
GLES20.GL_NEAREST
Run Code Online (Sandbox Code Playgroud)
仅当GL_TEXTURE_MIN_FILTER未使用mipmap将过滤器设置为过滤器时,才会呈现纹理.因此,当GL_TEXTURE_MIN_FILTER设置为最后两个时,它可以工作.
现在这是我不理解和好奇的.当我将我正在使用的图像缩小为512x512的纹理时,GL_TEXTURE_MIN_FILTER设置无关紧要.min过滤器的所有四个设置都有效.
所以我的问题是,对纹理使用最小滤镜时是否需要图像的尺寸?比如我需要使用方形图像吗?包装样式或磁过滤器的配置等其他问题可以解决吗?
或者它看起来像是设备的OpenGL实现错误?