我可以加载位于与 JavaScript 文件相同的相对路径中的图像文件
var imgObj = new Image();
imgObj.src = "images/backdropLevel0.jpg";
Run Code Online (Sandbox Code Playgroud)
但是我如何对文本文件做同样的事情(就像简单的和纯 JavaScript 一样)?
(它有一些我正在开发的 webGL 游戏的初始数据)。
附注。我不是在使用新的 File 对象询问来自客户端计算机的用户输入。
glGetBufferSubData是用于常规缓冲区还是纹理缓冲区?我试图解决为什么我的纹理没有出现,当我使用glGetBufferSubData读取缓冲区时,我得到了一些垃圾
struct TypeGLtexture //Associate texture data with a GL buffer
{
TypeGLbufferID GLbuffer;
TypeImageFile ImageFile;
void GenerateGLbuffer ()
{
if (GLbuffer.isActive==true || ImageFile.GetPixelArray().size()==0) return;
GLbuffer.isActive=true;
GLbuffer.isTexture=true;
GLbuffer.Name="Texture Buffer";
GLbuffer.ElementCount=ImageFile.GetPixelArray().size();
glEnable(GL_TEXTURE_2D);
glGenTextures (1,&GLbuffer.ID); //instantiate ONE buffer object and return its handle/ID
glBindTexture (GL_TEXTURE_2D,GLbuffer.ID); //connect the object to the GL_TEXTURE_2D docking point
glTexImage2D (GL_TEXTURE_2D,0,GL_RGB,ImageFile.GetProperties().width, ImageFile.GetProperties().height,0,GL_RGB,GL_UNSIGNED_BYTE,&(ImageFile.GetPixelArray()[0]));
if(ImageFile.GetProperties().width==6){
cout<<"Actual Data"<<endl;
for (unsigned i=0;i<GLbuffer.ElementCount;i++) cout<<(int)ImageFile.GetPixelArray()[i]<<" ";
cout<<endl<<endl;
cout<<"Buffer data"<<endl;
GLubyte read[GLbuffer.ElementCount]; //Read back from the buffer (to make sure)
glGetBufferSubData(GL_TEXTURE_2D,0,GLbuffer.ElementCount,read);
for (unsigned i=0;i<GLbuffer.ElementCount;i++) cout<<(int)read[i]<<" "; …
Run Code Online (Sandbox Code Playgroud) 假设我有以下数组(每个数组都有任意长度)并将它们用作备件箱; 将它们中的每一个放入缓冲区,然后让openGL读取elements数组中的索引,并通过从每个数组块中挑选来构造顶点.
我们可以使用
{coordinate v1,normal vn3,color c1,texCoord vt4 } 构造一个顶点
或者我们可以再次使用
{coordinate v1,再次使用普通vn3,使用颜色c3,texCoord vt2 } 构建另一个顶点
请注意,"坐标数组"还不是顶点,它只提供构造顶点的位置.
在使用缓冲区和着色器的现代openGl中,对于初学者来说,这样的事情会非常困难吗?
CoordinatesArray:
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
NormalsArray:
vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
vn -0.000001 0.000000 1.000000
vn 1.000000 …
我试图逐行读取文件.将每一行转换为以空字符结尾的字符串.将所有行推入向量并返回.
vector<const char*> TypeGLscene::LoadGLshader (string ThisFile)
{
ifstream fromFile;
fromFile.open(ThisFile);
if (fromFile.good()==false)
{
cout<<"Could not find file: "<<ThisFile<<endl;
exit(1);
}
vector<const char*> FileContents;
const char* OneLine;
string LineStr;
while (fromFile.good()==true)
{
getline(fromFile,LineStr);
OneLine = LineStr.c_str();
FileContents.push_back(OneLine);
}
fromFile.close();
return FileContents;
Run Code Online (Sandbox Code Playgroud)
问题是所有char字符串都是在堆栈中创建的,函数返回char*的向量.
我试图通过以下方式在堆上分配内存:
OneLine = new char[LineStr.size()+1];
Run Code Online (Sandbox Code Playgroud)
但我被卡住了,因为一旦分配,我就无法复制任何内容; 内容是const.
我怎么能在const char*上使用new关键字并在它实现它是const之前同时向它添加内容?
(更不用说我必须一个一个地删除它们,另一方面......真是一团糟)
编辑:我宁愿返回一个向量,但这一切都是因为我不知道快速(一行)方式将向量转换为const char**:
void glShaderSource(GLuint shader,
GLsizei count,
const GLchar **string,
const GLint *length);
Run Code Online (Sandbox Code Playgroud)